将动态JSON值解析为Java对象
在我的应用程序中,我有很多具有排序和筛选功能的概述(表)。由于不同的列可以容纳不同的值类型(字符串、数字、日期、集合等),因此这些列的过滤器也可以带来不同的值。让我向您展示几个示例(已转换为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>"(,...)]}
现在,我需要在将构建SQL查询的WHERE
子句的助手类中解析该JSON。在PHP中,这不是问题,因为我可以调用json_decode
,然后简单地检查某个值是array
、string
还是其他任何值。。。但是如何在Java中简单地做到这一点呢
到目前为止,我正在使用Spring的JsonJsonParser
(我没有发现Spring类的Jackson
、Gson
和其他解析器之间有任何明显的差异)
我曾考虑创建一个自己的数据对象类,使用三个不同的构造函数,或者为所有三种可能性创建三个数据对象类,但我不知道如何处理解析器解析JSON后为column_name
返回的值
简单地看一下这些例子,它给了我三种可能性:
Map<String, String>
Map<String, Map<String, String>>
Map<String, String[]>
有什么想法或线索吗
# 1 楼答案
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<String, Map<String, String>
模式try
,捕获JsonProcessingException,然后使用另一个映射模式重试# 2 楼答案
您必须在运行时检查值的类型。您可以使用
Map<String, Object>
或JsonNode
地图<;字符串,对象>
JsonNode