简体   繁体   中英

How to read JSON String attribute into custom class object using Gson?

When reading a JSON :

{"field":"value"}

into a String field :

public class Test {
    private String field;
}

using Gson.fromJson it works as intended and the member String field gets the value "value".

My question is, is there a way to read the same JSON into a custom class so that the custom class object can be constructed with the String value? eg

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

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

The reason being the String class is final and cannot be extended, yet I don't want the JSON to be changed into this :

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

If there is a way to extend the String class, it is the best. Otherwise, will need a way for Gson to read string into a custom class that can be constructed by string. Something to do with writing a custom TypeAdapter ?

You can use custom JsonDeserializer , JsonSerializer . Here is simple demo version:

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);
}

Be careful with internal Gson gson = new Gson() . If you have some other setup, you will need to register it on internal version or pass default MyField deserializer/serializer to your custom implementation.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM