V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
nanmu42
V2EX  ›  Java

请问, Java 中如何处理结构和字段不固定的 JSON?

  •  
  •   nanmu42 · 94 天前 · 1513 次点击
    这是一个创建于 94 天前的主题,其中的信息可能已经有所发展或是发生改变。

    在一个 Java 编写的 Flink 任务中,我需要将形如

    {
      "type": "A", # 固定字段
      "time": 86400, # 固定字段
      "data": { # 这里的字段和各个字段对应的数据类型都不固定
        "a": 1,
        "b": 2,
        "x": 3
      }
    }
    

    这样的 JSON 转化为形如

    {
      "work": "A", # 固定字段,对应上面的 type
      "duration": 86400, # 固定字段
      "payload": { # 对应上一个 JSON 的 data 部分
        "a_name": 1, # 字段名会被映射转换,部分字段会被丢掉
        "x_name": 3,
        "what": "ever" # 会有新增字段
      }
    }
    

    的 JSON,请问:

    1. 这个需求如何解决比较方便呢?
    2. 我可以为两种 JSON 定义 POJO 吗(我还有访问其中固定字段和判断处理的需求,这样是不是方便些?)?如何处理其中结构和字段不固定的部分呢?(定义成某种 Map 类型?我没有多少 Java 的经验)

    谢谢。

    8 条回复    2021-08-31 19:01:22 +08:00
    israinbow
        1
    israinbow   94 天前   ❤️ 1
    一个纯办法, 分隔符拿出来循环匹配, json 映射成 map, 尽量减少 pojo, 尤其是字段不固定的时候.
    chendy
        2
    chendy   94 天前   ❤️ 1
    看你是否需要实体类
    如果不需要的话用 JsonNode 之类的 api 做转换
    chengyiqun
        3
    chengyiqun   94 天前   ❤️ 1
    payload 定义成 map 就行了.
    opendragonhuang
        4
    opendragonhuang   93 天前   ❤️ 1
    可以看看 jackson 的 @JsonAnyGetter 和 @JsonAnySetter 注解
    cheng6563
        5
    cheng6563   93 天前   ❤️ 1
    直接放一个 fastjson 的 JSONObject
    evi1j
        6
    evi1j   93 天前   ❤️ 1
    是否只有 payload 部分是变化的,并且你的 pojo 都是需要在其他地方使用的。我们对这种情况的做法是先定义一个外部 pojo,payload 部分单独定义,通过泛型使用。这样:


    class WrapData<T> {

    private String work;

    private Long duration;

    private T payload;

    }
    janus77
        7
    janus77   92 天前   ❤️ 1
    经典 php 写法。这种东西传给前端估计要被打
    nanmu42
        8
    nanmu42   89 天前
    感谢各位,综合各位意见,我使用了 POJO 里嵌入 fastjson 的 JSONObject,目前体验尚佳。
    关于   ·   帮助文档   ·   API   ·   FAQ   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   894 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 32ms · UTC 21:03 · PVG 05:03 · LAX 13:03 · JFK 16:03
    ♥ Do have faith in what you're doing.