gpt4 book ai didi

java - 将动态 JSON 值解析为 Java 对象

转载 作者:搜寻专家 更新时间:2023-11-01 02:41:15 25 4
gpt4 key购买 nike

在我的应用程序中,我有很多具有排序和过滤功能的概览(表格)。因为不同的列可以包含不同的值类型(字符串、数字、日期、集合等),这些列的过滤器也可以带来不同的值。让我向您展示几个示例(已转换为 JSON,通过 REST 请求发送到服务器):

对于简单的字符串值,它是这样的:

{"<column_name>":"<value>"}

对于数字和日期列,过滤器如下所示:

{"<column_name>":[{"operator":"eq","value":"<value>"}]}
{"<column_name>":[{"operator":"eq","value":"<value1>"},{"operator":"gt","value":"<value2>"}]}

设置过滤器的样子

{"<column_name>":["<value1>","<value2>"(,...)]}

现在我需要在将构建 WHERE 的帮助程序类中解析该 JSON SQL 查询的子句。在 PHP 中这不是问题,因为我可以调用 json_decode然后简单地检查某个值是否为 array , string或者其他什么...但是如何简单地在 Java 中做到这一点?

到目前为止,我正在使用 Spring 的 JsonJsonParser (我没有发现 Spring 附带的不同解析器之间有任何明显的区别,例如 JacksonGson 和其他)。

我正在考虑使用三个不同的构造函数创建一个自己的数据对象类,或者为所有三种可能性创建三个数据对象类,但我不知道如何处理返回的对于 column_name在解析器解析 JSON 之后...

简单地看一下例子,它给了我三种可能性:

  1. Map<String, String>
  2. Map<String, Map<String, String>>
  3. Map<String, String[]>

有什么想法或线索吗?

最佳答案

Jackson 的 ObjectMapper treeToValue 应该可以帮到你。

http://fasterxml.github.io/jackson-databind/javadoc/2.2.0/com/fasterxml/jackson/databind/ObjectMapper.html#treeToValue%28com.fasterxml.jackson.core.TreeNode,%20java.lang.Class%29

您的主要问题是您的第一个版本的 JSON 与其他两个版本的结构不同。选择另外两个,您可以将 JSON 反序列化为 Map<String, Map<String, String>正如您所说,但第一个版本适合 map 。

有几个解决方案可供您使用:

  • 您更改 JSON 格式以始终匹配 Map<String, Map<String, String>模式
  • 您首先将 JSON 解析为 JsonNode,检查值的类型并将整个事物反序列化为正确的 Map 模式。
  • (又快又脏)你不改变 JSON,但你 try使用其中一种 Map 模式捕获 JsonProcessingException,然后使用其他 Map 模式重试

关于java - 将动态 JSON 值解析为 Java 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32721534/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com