2016-03-18 2 views
1

Я пытаюсь преобразовать карту> в JSON с использованием библиотеки gson. Проблема заключается в том, что строка возвращается после преобразования в JSON возвращает хэш-код объекта, но возвращает правильный список.преобразование карты <объект, список <>> в JSON с использованием библиотеки gson

{"[email protected]":["C","C++","Java"],"[email protected]5":["FreeCharge","Instagram","SnapChat","Twitter","Whatsapp"]} 

и в javascript Я не могу распечатать свойства объекта Chracteristic.

Вот карта я объявил

Map<Characteristic, List<String>> variantCharacteristics = new HashMap<Characteristic, List<String>>(); 

и

String variantJson = new Gson().toJson(variantCharacteristics); 

, когда я печать выше строки вар она печатает

{"[email protected]":["C","C++","Java"],"[email protected]5":["FreeCharge","Instagram","SnapChat","Twitter","Whatsapp"]} 
+0

Если вы используете 'Object' в качестве ключа, тогда GSON будет использовать' ToString() 'метод для получения ключа. какую ценность объекта вы ожидаете? –

+1

Отправьте свой Java-код тоже. – Rockstar

+0

у вас есть правильный геттер/сеттер в классе «Характеристика». – Braj

ответ

0

Попробуйте использовать enableComplexMapKeySerialization если вы хотите карту Ключ для сериализации в соответствии с правилами по умолчанию Gson вы можете использовать enableComplexMapKeySerialization.

Gson gson = new GsonBuilder().enableComplexMapKeySerialization() 
     .setPrettyPrinting().create(); 

Relevant post


Из документации enableComplexMapKeySerialization

Включения этой функции будет меняться только сериализированная формой, если ключ карты представляет собой сложный типа (т.е. не примитивный) в его сериализованном Форма JSON. По умолчанию реализация сериализации карты использует toString() на ключе; Однако, когда это вызывается затем один из следующих случаев применяются:

Карты как объекты JSON

В этом случае, предположим, что адаптер типа зарегистрирован для сериализации и десериализации какой-то момент класс, который содержит x и y, в/из JSON Primitive string value "(x, y)". Затем карта Java будет сериализована как JsonObject.

Ниже приведен пример:

Gson gson = new GsonBuilder() 
    .register(Point.class, new MyPointTypeAdapter()) 
    .enableComplexMapKeySerialization() 
    .create(); 

Map<Point, String> original = new LinkedHashMap<Point, String>(); 
original.put(new Point(5, 6), "a"); 
original.put(new Point(8, 8), "b"); 
System.out.println(gson.toJson(original, type)); 

Приведенный выше код печатает этот JSON объект:

{ 
"(5,6)": "a", 
"(8,8)": "b" 
} 

По умолчанию Gson преобразует классы приложения в формате JSON, используя свои встроенные адаптеры типа. Если преобразование JSON по умолчанию Gson не подходит для типа, расширьте этот класс, чтобы настроить преобразование. Вот пример адаптера типа для (X, Y) координат точки:

public class PointAdapter extends TypeAdapter<Point> { 
public Point read(JsonReader reader) throws IOException { 
    if (reader.peek() == JsonToken.NULL) { 
    reader.nextNull(); 
    return null; 
    } 
    String xy = reader.nextString(); 
    String[] parts = xy.split(","); 
    int x = Integer.parseInt(parts[0]); 
    int y = Integer.parseInt(parts[1]); 
    return new Point(x, y); 
} 
public void write(JsonWriter writer, Point value) throws IOException { 
    if (value == null) { 
    writer.nullValue(); 
    return; 
    } 
    String xy = value.getX() + "," + value.getY(); 
    writer.value(xy); 
} 
} 

Подробнее о GSON TypeAdapter

+0

waht это новый класс MyPointTypeAdapter()). У меня нет MyCharacteristicTypeAdapter. – viveksinghggits

+0

здесь [ссылка] (https://google-gson.googlecode.com/svn/trunk/gson/docs/javadocs/com/google/gson/TypeAdapter.html), чтобы прочитать об этом. обновил сообщение также. – Braj