json - Java 8 的简单 JSON 值解析
问题描述
Java 8 这里虽然我的类路径中已经有 Jackson 和 Jettison(作为依赖项)。
我收到以下 JSON 字符串(例如):
{
"widgets": {
"email": "someone@example.com",
"maxSize": 50
},
"environments": {
"LOCAL": {
"maxSize": "40"
},
"DEV": {
"maxSize": "100"
}
},
"fruits": [
"apples",
"oranges"
]
}
在运行时,字段的值会有所不同。
我只是想environments/DEV/maxSize
从这个字符串中读取值;我能写出什么最简单的代码来提取这个值?
理想情况下,可能有一些内置的 Java 8 支持这种类型的东西,但如果注意的话,我希望 Jackson 或 Jettison 提供这种功能,而不必向我的项目添加新的 jar/依赖项。最坏的情况就是使用某种正则表达式来去除我认为的值......
有任何想法吗?
解决方案
一个简单的选择是使用JsonPath
. 可以使用如下路径说明符拉取嵌套属性$.environments.DEV.maxSize
:
long maxSize = JsonPath.parse(json).read("$.environments.DEV.maxSize", Long.class);
对于杰克逊,这可以通过以下方式完成JsonNode
:
long maxSize = new ObjectMapper()
.readTree(json)
.get("environments").get("DEV").get("maxSize").asLong();
或者,如果您有一个代表数据的类,您可以反序列化为:
MyConfig myConfig = new ObjectMapper().readValue(json, MyConfig.class);
long maxSize = myConfig.getEnvironments().get(Environment.DEV).getMaxSize();
推荐阅读
- python - 如何将自定义属性连接到节点输入?
- python - 如何通过 Django 中的 celery 异步任务处理数据库条目的创建
- javascript - 何时使用 d3.transition().each()?
- android - 我究竟做错了什么?我的超时不起作用
- python - 2 系列的笛卡尔积
- android - 如何在android中使用文本编写这种类型的图标
- javascript - 尝试通过 laravel 中的 ajax 将数据发布到控制器时出现 MethodNotAllowedHttpException
- swift - 从 IBAction 函数中选择/推送到不同的视图控制器?
- react-native-navigation - 如何知道 sideMenu 可见性状态
- django - Django DateTimeField 不可编辑