#java #json #casting #guava
#java #json #Кастинг #guava
Вопрос:
Я использую Google Guava для вычисления разницы между двумя картами, а затем с учетом этих различий я хотел бы построить еще одну карту для дальнейшей обработки следующим образом:
Map<String, Map<String, Object>> fieldToDiffMap = new HashMap<>();
MapDifference<String, LinkedHashMap> diff =
Maps.difference(oldMap, currMap);
Map<String, MapDifference.ValueDifference<LinkedHashMap>> entriesDiffering = diff
.entriesDiffering();
for (Map.Entry<String, MapDifference.ValueDifference<LinkedHashMap>> entry :
entriesDiffering.entrySet()) {
Map<String, String> diffMap = new HashMap<>();
MapDifference.ValueDifference<LinkedHashMap> valueDiff = entry.getValue();
diffMap.put("Old Value", valueDiff.leftValue().get("value")); <--THIS LINE GIVING ERROR
diffMap.put("New Value", valueDiff.rightValue().get("value")); <--THIS LINE GIVING ERROR
fieldToDiffMap.put(entry.getKey(), diffMap);
}
Здесь я получаю ошибку компилятора:
incompatible types: java.lang.Object cannot be converted to java.lang.String
Я попытался справиться с этим, заменив две вышеуказанные строки следующим образом:
diffMap.put("Old Value", valueDiff.leftValue().get("value").toString());
diffMap.put("New Value", valueDiff.rightValue().get("value").toString());
Но с этими изменениями ошибка компилятора исчезла, код выполняется успешно, но строки вставляются между дополнительными кавычками следующим образом:
"Test String" is getting converted into ""Test String""
Может кто-нибудь, пожалуйста, помочь здесь?
Комментарии:
1. Не могли бы вы предоставить какой-нибудь код, показывающий
oldMap
иcurrMap
создающий?
Ответ №1:
Вы используете необработанные типы в своем определении карты. Вот исправленная версия, которая должна работать для вас:
//given
Map<String, Map<String, Object>> fieldToDiffMap = new HashMap<>();
Map<String, LinkedHashMap<String, Object>> oldMap = ImmutableMap.of(
"foo", Maps.newLinkedHashMap(ImmutableMap.of("value", "Test String")),
"bar", Maps.newLinkedHashMap(ImmutableMap.of("value", "Same String"))
);
Map<String, LinkedHashMap<String, Object>> currMap = ImmutableMap.of(
"foo", Maps.newLinkedHashMap(ImmutableMap.of("value", ""Test String"")),
"bar", Maps.newLinkedHashMap(ImmutableMap.of("value", "Same String"))
);
//when
MapDifference<String, LinkedHashMap<String, Object>> diff = // not raw types MapDifference<String, LinkedHashMap> diff
Maps.difference(oldMap, currMap);
Map<String, MapDifference.ValueDifference<LinkedHashMap<String, Object>>> entriesDiffering = diff
.entriesDiffering();
for (Map.Entry<String, MapDifference.ValueDifference<LinkedHashMap<String, Object>>> entry :
entriesDiffering.entrySet()) {
Map<String, Object> diffMap = new HashMap<>();
MapDifference.ValueDifference<LinkedHashMap<String, Object>> valueDiff = entry.getValue();
diffMap.put("Old Value", valueDiff.leftValue().get("value"));// <--THIS LINE GIVING ERROR
diffMap.put("New Value", valueDiff.rightValue().get("value"));// <--THIS LINE GIVING ERROR
fieldToDiffMap.put(entry.getKey(), diffMap);
}
//then
assertThat(fieldToDiffMap) // {foo={Old Value=Test String, New Value="Test String"}}
.containsOnly(entry("foo", ImmutableMap.of(
"Old Value", "Test String",
"New Value", ""Test String""))
);