【问题标题】:How to get dynamic JSON Value by Key without parsing to Java Object?如何在不解析为 Java 对象的情况下按键获取动态 JSON 值?
【发布时间】:2019-11-28 14:37:35
【问题描述】:

我正在尝试使用动态键获取 json(具有未知模板)值;

"user.specs.id"

问题是我的 json 结构不是静态的,因此我无法将其解析为 java 对象或使用 Gson 方法获取其属性。

{
    "user": {
        "specs": {
            "id": 12222,
            "name": "foo"
        } 
    }
}

有没有办法用某个键从任何 json 中提取一些数据?

编辑:我有一个类似的服务方法;

public Object getValueByKey(String json, String key);

“json”参数的可能值;

{"name": "test"}    //possible key "name"

{"user": {"id": 1232}}   //possible key "user.id"

{"cars": ["car1", "car2"]}   //possible key "cars[0]"

【问题讨论】:

标签: java json


【解决方案1】:

正如@Michał Ziober 的评论,您可以通过使用JsonPath 来实现这一点,如下所示:

Maven 依赖项

<dependency>
    <groupId>com.jayway.jsonpath</groupId>
    <artifactId>json-path</artifactId>
    <version>2.4.0</version>
</dependency>

代码 sn-p

public static void main(String[] args) {
    getValueByKey("{\"name\": \"test\"}", "name");
    getValueByKey("{\"user\": {\"id\": 1232}}", "user.id");
    getValueByKey("{\"cars\": [\"car1\", \"car2\"]}", "cars[0]");
}

public static void getValueByKey(String json, String key) {
    DocumentContext jsonContext = JsonPath.parse(json);
    Object value = jsonContext.read(key);
    System.out.println(value.toString());
}

控制台输出

11:38:50.840 [main] 调试 c.j.j.internal.path.CompiledPath - 评估路径:$['name']
测试
11:38:50.855 [main] 调试 c.j.j.internal.path.CompiledPath - 评估路径:$['user']['id']
1232
11:38:50.855 [main] 调试 c.j.j.internal.path.CompiledPath - 评估路径:$['cars'][0]
汽车1


阅读全文

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多