java - Gson 序列化/反序列化映射到/从 KeyValuePairs 列表

标签 java json dictionary gson

在服务器端我得到了这个 API(示例)(我不能修改它。)

namespace MyNameSpace
{
    [Serializable][DataContract]
    public class GetMyObject
    {
        [DataMember]
        public Dictionary<int, int> MyDictionary { get; set; }
    }
}

然后服务器发送这个 JSON:

{
    "MyDictionary" : 
        [{
            "Key" : 1,
            "Value" : 1
        },
        {
            "Key" : 2,
            "Value" : 2
        },
        {
            "Key" : 3,
            "Value" : 3
        },
        {
            "Key" : 4,
            "Value" : 4
        }]
}

在客户端,我必须创建这些类以进行正确的反序列化:

class GetMyObject {
    @SerializedName("MyDictionary")
    private List<MyDictionaryItem> myDictionary;
}

class MyDictionaryItem {
    @SerializedName("Key")
    private int key;

    @SerializedName("Value")
    private int value;
}

我如何配置 GSON 以简单地使用它:(序列化和反序列化)

class GetMyObject {
    @SerializedName("MyDictionary")
    private Map<Integer, Integer> myDictionary;
}

它对复杂的关键对象更加有趣,例如:

class ComplexKey {
    @SerializedName("Key1")
    private int key1;

    @SerializedName("Key2")
    private String key2;
}

class GetMyObject {
    @SerializedName("MyDictionary")
    private Map<ComplexKey, Integer> myDictionary;
}

最佳答案

创建自定义 JsonDeserializer对于 Map<?, ?> :

public class MyDictionaryConverter implements JsonDeserializer<Map<?, ?>> {
    public Map<Object, Object> deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext ctx) {
        Type[] keyAndValueTypes = $Gson$Types.getMapKeyAndValueTypes(typeOfT, $Gson$Types.getRawType(typeOfT));

        Map<Object, Object> vals = new HashMap<Object, Object>();
        for (JsonElement item : json.getAsJsonArray()) {
            Object key = ctx.deserialize(item.getAsJsonObject().get("Key"), keyAndValueTypes[0]);
            Object value = ctx.deserialize(item.getAsJsonObject().get("Value"), keyAndValueTypes[1]);
            vals.put(key, value);
        }
        return vals;
    }
}

并注册它:

gsonBuilder.registerTypeAdapter(new TypeToken<Map>(){}.getType(),
        new MyDictionaryConverter());

关于java - Gson 序列化/反序列化映射到/从 KeyValuePairs 列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29695738/

相关文章:

php - jQuery/PHP ajaxForm 获取 JSON 编码的结果

python - 将带有列表的字典添加到 Pandas DataFrame(pd.DataFrame(dict) vs df.append(dict))

python - 如何在没有转义斜线的情况下将字典放入 JSON

java - 对于 Java 中的每个循环都有字数

java - java中的毫秒计时

java - Gson、解析json内部类列表、javabean

php - 在 PHP 数组中添加要键入的字符

java - 如何使用 Cloneable 类型作为 Java 泛型类的参数

java - SimpleDateFormat 无法解析日期

python - 将值添加到同一字典中的键