【问题标题】:How to read JSON String attribute into custom class object using Gson?如何使用 Gson 将 JSON 字符串属性读入自定义类对象?
【发布时间】:2017-10-31 08:04:41
【问题描述】:

读取 JSON 时:

{"field":"value"}

进入一个字符串字段:

public class Test {
    private String field;
}

使用Gson.fromJson,它按预期工作,成员字符串字段获取值“值”。

我的问题是,有没有办法将相同的 JSON 读入自定义类,以便可以使用 String 值构造自定义类对象?例如

public class Test {
    private MyField<String> field;
}

public class MyField<T> {
    private T value;
    public MyField(T v) {
        value = v;
    }
}

String 类的原因是最终的,不能扩展,但我不希望 JSON 变成这样:

{"field":{"value":"value"}}

如果有办法扩展 String 类,那是最好的。否则,将需要一种方法让 Gson 将字符串读入可由字符串构造的自定义类。与编写自定义 TypeAdapter 有关吗?

【问题讨论】:

  • 有趣的是,这个社区如何不说话就否定......

标签: java json string gson


【解决方案1】:

您可以使用自定义JsonDeserializerJsonSerializer。这是简单的演示版:

static class MyFieldAsValueTypeAdapter<T> implements
        JsonDeserializer<MyField<T>>, JsonSerializer<MyField<T>> {
    private Gson gson = new Gson();
    @Override
    public MyField<T> deserialize(JsonElement json, Type typeOfT,
                                  JsonDeserializationContext context)
            throws JsonParseException {
        JsonObject obj = new JsonObject();
        obj.add("value", json);
        return gson.fromJson(obj, typeOfT);
    }

    @Override
    public JsonElement serialize(MyField<T> src, Type typeOfSrc,
                                 JsonSerializationContext context) {
        return context.serialize(src.getValue());
    }
}

public static void main(String[] args) {
    GsonBuilder b = new GsonBuilder();
    b.registerTypeAdapter(MyField.class , new MyFieldAsValueTypeAdapter());
    Gson gson = b.create();

    String json = "{\"field\":\"value1\"}";
    Test test = gson.fromJson(json, Test.class);
}

小心内部Gson gson = new Gson()。如果您有其他设置,则需要在内部版本上注册它或将默认 MyField 反序列化器/序列化器传递给您的自定义实现。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-03-27
    • 2015-11-19
    • 1970-01-01
    • 2018-11-16
    • 1970-01-01
    • 1970-01-01
    • 2015-01-11
    • 1970-01-01
    相关资源
    最近更新 更多