Gson将小写JSON反序列化为camel-case Class对象

时间:2017-08-10 15:07:15

标签: java json serialization gson deserialization

我正在尝试将所有字段设置为小写的JSON反序列化。问题是:我的POJO对象将属性设置为camel-case,当我尝试使用Gson.fromJson反序列化时,我的camel-case属性未设置。

示例JSON:

[
    {
        "idpojo": 1,
        "namepojo": "test"
    }
]

POJO班级:

public class Pojo {

    private Integer idPojo;
    private String namePojo;

    //constructors, getters and setters

}

反序列化代码:

List<T> objects = new ArrayList<>();
// At this point I only have an variable with a reference to a classe. Let's assume it is in fact a reference to Pojo class
Class VARIABLE_WITH_REFERENCE_TO_A_CLASS = Pojo.class;
Class pojoReference = VARIABLE_WITH_REFERENCE_TO_A_CLASS;
String json = EXAMPLE_JSON_HERE;
JSONArray jsonArray = new JSONArray(json);
int len = jsonArray.length();
for (int i = 0; i < len; i++) {
    objects.add((T) new Gson().fromJson(jsonArray.get(i).toString(), pojoReference)));
}

我将JSON反序列化为泛型类列表而不是Pojo类列表的原因是因为在我的代码的这一点上我不知道应该创建什么类我的集合。

此代码工作正常。问题是:反序列化后没有设置Pojo类的camel-case属性。

我到目前为止所尝试的一直是在字段上使用@SerializedName注释,还创建自定义反序列化器,但对我来说也没有诀窍,因为我真的不希望/可以编写特定代码来反序列化对象。

问题:

使用泛型,如何将具有小写属性的JSON对象反序列化为具有camel-case属性的Java类(如Pojo.class)?

2 个答案:

答案 0 :(得分:1)

fromJson()方法的文档说明您要将JSON反序列化的对象类型不能是通用的。您可以指定一个类型并使用您提到的@SerializedName属性来克服套管不匹配的问题,但前提是您知道从JSON创建的对象类型。

答案 1 :(得分:0)

使用Jackson代替Gson进行反序列化来解决问题。

杰克逊必须是2.5或更高版本,还必须配置映射器以接受不区分大小写的属性。

新工作代码:

ObjectMapper mapper = new ObjectMapper();
mapper.configure(MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES, true);

List<T> objects = new ArrayList<>();
// At this point I only have an variable with a reference to a classe. Let's assume it is in fact a reference to Pojo class
Class VARIABLE_WITH_REFERENCE_TO_A_CLASS = Pojo.class;
Class pojoReference = VARIABLE_WITH_REFERENCE_TO_A_CLASS;
String json = EXAMPLE_JSON_HERE;
JSONArray jsonArray = new JSONArray(json);
int len = jsonArray.length();
for (int i = 0; i < len; i++) {
    objects.add(mapper.readValue(new JSONObject(json).toString(), pojoReference));
}

感谢大家的时间!