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

2021-08-26 19:23:02 +08:00
 nanmu42

在一个 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 的经验)

谢谢。

2439 次点击
所在节点    Java
8 条回复
israinbow
2021-08-26 19:30:37 +08:00
一个纯办法, 分隔符拿出来循环匹配, json 映射成 map, 尽量减少 pojo, 尤其是字段不固定的时候.
chendy
2021-08-26 20:50:48 +08:00
看你是否需要实体类
如果不需要的话用 JsonNode 之类的 api 做转换
chengyiqun
2021-08-26 21:00:56 +08:00
payload 定义成 map 就行了.
opendragonhuang
2021-08-27 09:05:22 +08:00
可以看看 jackson 的 @JsonAnyGetter 和 @JsonAnySetter 注解
cheng6563
2021-08-27 09:26:36 +08:00
直接放一个 fastjson 的 JSONObject
evi1j
2021-08-27 09:58:14 +08:00
是否只有 payload 部分是变化的,并且你的 pojo 都是需要在其他地方使用的。我们对这种情况的做法是先定义一个外部 pojo,payload 部分单独定义,通过泛型使用。这样:


class WrapData<T> {

private String work;

private Long duration;

private T payload;

}
janus77
2021-08-28 15:31:20 +08:00
经典 php 写法。这种东西传给前端估计要被打
nanmu42
2021-08-31 19:01:22 +08:00
感谢各位,综合各位意见,我使用了 POJO 里嵌入 fastjson 的 JSONObject,目前体验尚佳。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/798204

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX