【问题标题】:GSON from JSON with numeric class names来自带有数字类名的 JSON 的 GSON
【发布时间】:2018-04-29 13:07:25
【问题描述】:

我有一个来自服务器的 JSON 字符串,我无法控制它。
我通过 jsonschema2pojo 库的编程使用生成了 Java 类。
我正在使用 GSON 将 JSON 反序列化为我的 Java 对象。

这是 JSON 的示例。

"description_by_id": {
    "50": {
        "field1": "value1",
        "field2": "value2",
        "field3": "value3"
    }
}

“50”子类实际上只是 18 个以数字命名的类中的 1 个。
当 jsonschema2pojo 生成 Java 类时,它可以理解地在前面添加一个下划线来创建类名(所以,_50)。

jsonschema2pojo 使用该成员生成 DescriptionById 类:

@JsonProperty("50") private com.me.models._50 _50;

getter 看起来像这样(setter 类似):

@JsonProperty("50") public com.me.models._50 get50() { return _50; }

我正在像这样使用 GSON:

Gson gson = new GsonBuilder().setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES).create();

但是_50这个对象和其他17个类似的对象在GSON做完后都是空的,我检查了JSON中的对应点实际上是用真实值填充的。

我可以在这条链上做些什么来让它正常工作而无需手动解决问题?

【问题讨论】:

    标签: java json gson jsonschema2pojo


    【解决方案1】:

    “50”子类实际上只是 18 个以数字命名的类中的 1 个

    当您获得一个没有 Java 类的额外 ID 时会发生什么? Gson 不知道如何处理它......

    不要上课。使用地图。

    制作这个“内在的”POJO

    public class Inner {
    
        private String field1;
        private String field2;
        private String field3;
    
    }
    

    还有外层POJO

    public class Outer {
        private TreeMap<String, Inner> description_by_id;
    }
    

    然后你会得到someOuter.getDescriptionById("50").getField1()

    (根据需要添加回 Gson 属性)

    【讨论】:

    • 服务器应用程序的性质意味着这些类固定为 18,并且它们的名称不会改变。这是非常静态的。无论如何,您所描述的内容可以使用 GSON 自动完成吗?
    • 自动是什么意思?是否所有 18 个类都包含相同的“内部”内容?如果是这样,为每个类设置唯一的类仍然是一个糟糕的设计。
    • 自动 - 表示我在原始问题中对 GSON 的使用。或者我需要在 GSON 通话之前/之后进行破解吗?至于内部内容,所有 18 个类都有相同的字段名称/类型,它们只是不同的值。我同意设计评论,尽管我无法控制有关此服务器的任何内容,包括设计、代码等;我是纯粹的消费者。
    猜你喜欢
    • 2017-10-22
    • 2013-11-26
    • 1970-01-01
    • 2020-02-24
    • 2014-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-14
    相关资源
    最近更新 更多