json的模型类

时间:2016-09-18 15:23:11

标签: java json gson

我已经检查过许多如何为具有键值对的json创建Model类的示例。但我有以下类型的json,其中字段名称取决于json中的值。请看下面的json -

   { "args" : 
    [{
    "name":"fullName",
    "value":"Vikram",
    "type":"String"
    },
    {
    "name":"userName",
    "value":"abc@gmail.com",
    "type":"String"
    }
    ]
}

有人可以请教我如何为这个json创建模型类吗? 对于上面的json,我希望我的模型类应该如下 -

public class Model {

    private String userName;
    private String fullName;
...


    public String getUserName() {
        return userName;
    }

    public void setUserName(String name) {
        this.userName = name;
    }

    public String getFullName() {
        return fullName;
    }

    public void setFullName(String value) {
        this.fullName = value;
    }
}

这可能吗? 我知道如何为json创建模型类,如 -

 { "args" : 
    [{
    "fullName":"Vikram",
    "userName":"abc@gmail.com"
    }
    ] 
}

2 个答案:

答案 0 :(得分:1)

以您提到的方式创建模型是不可能的,因为在编译时不知道布局。 (Java没有类型提供者)

也许一种方便的方法是序列化到一些字典中,但保存值的类型:

class Model {
    private final Map<String, Value> fields = new HashMap<>();

    public Value getValue(String fieldName) {
        return fields.get(fieldName);
    }

    public static Model deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) {
        Model ret = new Model();

        JsonArray args = json.getAsJsonObject() // Get 'args' array
            .get("args")
            .getAsJsonArray();

        for(JsonElement e : args) {
            JsonObject o = e.getAsJsonObject(); 
            ret.fields.put(
                o.get("name").getAsString(),
                new Value(o.get("type").getAsString(), o.get("value"))
            );
        }

        return ret;
    }
}
class Value {
    private final String type;
    private final JsonElement obj;

    public Value(String type, JsonElement obj) {
        this.type = type;
        this.obj = obj;
    }

    public String getType() {
        return type;
    }

    public String getAsString() {
        return obj.getAsString();
    }
    ...
}

然后,您可以将此deserialize方法注册为类型适配器:

Gson gson = new GsonBuilder()
    .registerTypeAdapter(
        Model.class,
        (JsonDeserializer<Model>) Model::deserialize
    ).create();

String json = ...;

Model m = gson.fromJson(json, Model.class);

System.out.println(m.getValue("fullName").getAsString()); // 'Vikram'
System.out.println(m.getValue("userName").getAsString()); // 'abc@gmail.com'

答案 1 :(得分:0)

public class Model {

    private String name;
    private String value;
    private String type;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getValue() {
        return value;
    }

    public void setValue(String value) {
        this.value = value;
    }

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }

}

使用此课程。用于存储数据。创建

List<Model> list =new ArrayList<>();

创建对象模型类设置其值然后添加到列表。