Можем ли мы сделать объект в качестве ключа на карте при использовании JSON?
В качестве кода ниже:
public class Main {
public class innerPerson{
private String name;
public String getName(){
return name;
}
}
public static void main(String[] args){
ObjectMapper om = new ObjectMapper();
Map<innerPerson, String> map = new HashMap<innerPerson,String>();
innerPerson one = new Main().new innerPerson();
one.name = "david";
innerPerson two = new Main().new innerPerson();
two.name = "saa";
innerPerson three = new Main().new innerPerson();
three.name = "yyy";
map.put(one, "david");
map.put(two, "11");
map.put(three, "true");
try {
String ans = om.writeValueAsString(map);
System.out.println(ans);
} catch (JsonGenerationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (JsonMappingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
Вывод:
{"[email protected]":"david","[email protected]":"true","[email protected]":"11"}
Можно ли сделать ключ карты точным, но не адрес объекта? Как?
Ответы
Ответ 1
Можно ли сделать объект в качестве ключа на карте при использовании JSON?
Строго, нет. Структура данных карты JSON представляет собой структуру данных объекта JSON, которая представляет собой набор пар имя/значение, где имена элементов должны быть строками. Таким образом, хотя разумно воспринимать и связывать объект JSON как карту, ключи карты JSON также должны быть строками - опять же, поскольку JSON-карта является объектом JSON. Спецификация структуры объекта (карты) JSON доступна по адресу http://www.json.org.
Можно ли сделать ключ карты точным, но не адрес объекта? Как?
Costi правильно описал поведение стандартного сериализатора ключей по умолчанию Jackson, который просто вызывает метод toString()
ключа карты Java. Вместо того, чтобы модифицировать метод toString()
, чтобы вернуть JSON-дружественное представление ключа карты, также возможно и достаточно просто реализовать пользовательскую сериализацию ключа карты с помощью Jackson. Один из примеров этого можно найти в Сериализации карты < Date, String > с Джексоном.
Ответ 2
"Адрес", который вы видите напечатанным, просто возвращает ваш метод toString()
.
Без учета маршалинга JSON. Чтобы ваш код работал, вам необходимо реализовать: equals()
, hashCode()
и toString()
в вашем классе InnerPerson
. Если вы вернете свойство name в toString()
, это станет ключом вашего представления JSON.
Но без правильных реализаций для equals()
и hashCode()
вы не можете правильно использовать HashMap.
Ответ 3
В дополнение к существующим правильным ответам вы также можете добавить собственные сериализаторы ключей и десериализаторы ключей с использованием интерфейса модуля (обычно с SimpleModule
). Это позволяет вам определять сериализацию и десериализацию ключей извне. В любом случае, клавиши в JSON должны быть строками, как указывали другие.