Java:使用GSON映射的JSON

时间:2018-10-17 12:55:31

标签: java json jackson gson

我有一个像这样的字符串

{"key0":"value0","key1":"value1","key0":"value3"}

我想将其存储在地图中,所需结果为{“ key0”:“ value3”,“ key1”:“ value1”}

使用org.json.JsonObject:我将字符串传递给构造函数,并抛出重复键异常

使用GSON:尝试新的Gson.fromJson(string,Type)时出现相同的异常

使用Jackson:确实有效

是否存在使用JSONObject和Gson实现相同目的的解决方法

3 个答案:

答案 0 :(得分:1)

有趣的是,如果您首先将json转换为Object,然后转换为Map<String,String>,则会发生所需的结果:

String json = "{\"key0\":\"value0\",\"key1\":\"value1\",\"key0\":\"value3\"}";
Gson gson = new Gson();
Object obj = gson.fromJson(json, Object.class);
try {
    Map<String,String> map = (Map<String, String>)obj;
    // Outputs...
    // key0=value3
    // key1=value1
    for (Map.Entry<String,String> entry : map.entrySet()) {
        System.out.println(entry.getKey() + "=" + entry.getValue());
    }
} catch (ClassCastException e) {
    e.printStackTrace();
}

答案 1 :(得分:1)

GSON使用MapTypeAdapterFactory来反序列化地图。以下是其源代码的简短摘录,其中在地图上放置了一个新条目:

V replaced = map.put(key, value);
if (replaced != null) {
    throw new JsonSyntaxException("duplicate key: " + key);
}

知道至少有一种方法可以绕过这种严格的行为:创建覆盖方法put(..)的自己的地图以始终返回null,例如:

public class DuploMap extends HashMap<String, String>{
    @Override
    public String put(String key, String value) {
        super.put(key, value);
        return null; 
    }
}

然后像这样失败:

gson.fromJson(JSON, DuploMap.class);

不会抛出该异常。

答案 2 :(得分:0)

如果您不介意手动操作,则可以使用GSON的JsonReader。

从正面看:

  • 更快(无反射,无投射)
  • 完全在您的控制之下

-

String json = "{"key0":"value0","key1":"value1","key0":"value3"}";
JsonReader jsonReader = new JsonReader(new StringReader(json));
HashMap<String,String> map = new HashMap<String, String>()
String currKey;
try {
    while(jsonReader.hasNext()){
        JsonToken nextToken = jsonReader.peek();
           if(JsonToken.NAME.equals(nextToken)){
               currKey = jsonReader.nextName();
           }
           if(JsonToken.STRING.equals(nextToken)){
               map.put(currKey, jsonReader.nextString())
           }
    }
} catch (IOException e) {
   e.printStackTrace();
}