【问题标题】:Gson deserialize lowercase JSON to camel-case Class objectGson 将小写 JSON 反序列化为驼峰类对象
【发布时间】:2017-08-10 15:07:14
【问题描述】:

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

示例 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 类的驼峰式属性。

到目前为止,我一直在尝试在字段上使用 @SerializedName 注释,并创建自定义反序列化器,但对我来说也没有这个技巧,因为我真的不想/可以编写特定的代码来反序列化对象.

问题:

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

【问题讨论】:

    标签: java json serialization gson deserialization


    【解决方案1】:

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

    【讨论】:

    • 感谢@Tyler 的输入,但我说过,这不是我的选择。
    【解决方案2】:

    解决了使用 Jackson 而不是 Gson 进行反序列化的问题。

    Jackson 必须是 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));
    }
    

    感谢大家的宝贵时间!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-03
      • 2012-03-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多