Как я могу преобразовать JSON в HashMap с помощью Gson? - PullRequest
260 голосов
/ 06 мая 2010

Я запрашиваю данные с сервера, который возвращает данные в формате JSON. Встраивание HashMap в JSON при выполнении запроса совсем не сложно, но другой способ кажется немного сложным. Ответ JSON выглядит следующим образом:

{ 
    "header" : { 
        "alerts" : [ 
            {
                "AlertID" : "2",
                "TSExpires" : null,
                "Target" : "1",
                "Text" : "woot",
                "Type" : "1"
            },
            { 
                "AlertID" : "3",
                "TSExpires" : null,
                "Target" : "1",
                "Text" : "woot",
                "Type" : "1"
            }
        ],
        "session" : "0bc8d0835f93ac3ebbf11560b2c5be9a"
    },
    "result" : "4be26bc400d3c"
}

Каким способом было бы проще всего получить доступ к этим данным? Я использую модуль GSON.

Ответы [ 16 ]

1 голос
/ 12 апреля 2018

Вот одна строка, которая сделает это:

HashMap<String, Object> myMap =
   gson.fromJson(yourJson, new TypeToken<HashMap<String, Object>>(){}.getType());
1 голос
/ 01 марта 2013

Я преодолел аналогичную проблему с пользовательским JsonDeSerializer. Я попытался сделать это немного общим, но все еще недостаточно. Это решение, хотя и соответствует моим потребностям.

Прежде всего вам необходимо реализовать новый JsonDeserializer для объектов Map.

public class MapDeserializer<T, U> implements JsonDeserializer<Map<T, U>>

И метод десериализации будет выглядеть примерно так:

public Map<T, U> deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context)
        throws JsonParseException {

        if (!json.isJsonObject()) {
            return null;
        }

        JsonObject jsonObject = json.getAsJsonObject();
        Set<Entry<String, JsonElement>> jsonEntrySet = jsonObject.entrySet();
        Map<T, U> deserializedMap = new HashMap<T, U>();

        for (Entry<java.lang.String, JsonElement> entry : jsonEntrySet) {
            try {
                U value = context.deserialize(entry.getValue(), getMyType());
                deserializedMap.put((T) entry.getKey(), value);
            } catch (Exception ex) {
                logger.info("Could not deserialize map.", ex);
            }
        }

        return deserializedMap;
    }

Недостаток этого решения в том, что ключ моей карты всегда имеет тип "String". Однако, изменяя некоторые вещи, кто-то может сделать это общим. Кроме того, я должен сказать, что класс значения должен быть передан в конструкторе. Таким образом, метод getMyType() в моем коде возвращает тип значений Map, которые были переданы в конструктор.

Вы можете сослаться на этот пост Как написать собственный десериализатор JSON для Gson? , чтобы узнать больше о пользовательских десериализаторах.

0 голосов
/ 06 октября 2018

Это скорее дополнение к ответ Кевина Долана , чем полный ответ, но у меня возникли проблемы с извлечением типа из числа. Это мое решение:

private Object handlePrimitive(JsonPrimitive json) {
  if(json.isBoolean()) {
    return json.getAsBoolean();
  } else if(json.isString())
    return json.getAsString();
  }

  Number num = element.getAsNumber();

  if(num instanceof Integer){
    map.put(fieldName, num.intValue());
  } else if(num instanceof Long){
    map.put(fieldName, num.longValue());
  } else if(num instanceof Float){
    map.put(fieldName, num.floatValue());
  } else {    // Double
     map.put(fieldName, num.doubleValue());
  }
}
0 голосов
/ 21 сентября 2017
 HashMap<String, String> jsonToMap(String JsonDetectionString) throws JSONException {

    HashMap<String, String> map = new HashMap<String, String>();
    Gson gson = new Gson();

    map = (HashMap<String, String>) gson.fromJson(JsonDetectionString, map.getClass());

    return map;

}
0 голосов
/ 21 апреля 2015

Я использовал этот код:

Gson gson = new Gson();
HashMap<String, Object> fields = gson.fromJson(json, HashMap.class);
0 голосов
/ 06 мая 2010

JSONObject обычно использует HashMap для хранения данных. Таким образом, вы можете использовать его как карту в вашем коде.

Пример,

JSONObject obj = JSONObject.fromObject(strRepresentation);
Iterator i = obj.entrySet().iterator();
while (i.hasNext()) {
   Map.Entry e = (Map.Entry)i.next();
   System.out.println("Key: " + e.getKey());
   System.out.println("Value: " + e.getValue());
}
...