java - 如何通过Key获取动态JSON值而不解析为Java对象?

标签 java json

我正在尝试获取带有动态键的 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]"

最佳答案

正如 @Michał Ziober 的评论,您可以通过使用 JsonPath 来简单地实现此目的,如下所示:

Maven 依赖

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

代码片段

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] DEBUG c.j.j.internal.path.CompiledPath - Evaluating path: $['name']
test
11:38:50.855 [main] DEBUG c.j.j.internal.path.CompiledPath - Evaluating path: $['user']['id']
1232
11:38:50.855 [main] DEBUG c.j.j.internal.path.CompiledPath - Evaluating path: $['cars'][0]
car1

<小时/>

了解更多

关于java - 如何通过Key获取动态JSON值而不解析为Java对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59065992/

相关文章:

java - 不兼容的类型 : Node cannot be converted to Comparable (when passing as a parameter)

c# - 如何在序列化 OData 响应时忽略 Null 值

javascript - lodash 中不区分大小写的 group By

json - 将 JSON/NSDictionary 反序列化为 Swift 对象

ios - 没有找到与 RestKit 的可映射关系值 keyPath

java - 使用 Android Studio 3.0 在 Kotlin 中出现 RxJava zipWith IDE 错误

java - 模式匹配出了什么问题?

java - 如何找到所有可用的 JDBC 驱动程序?

java - 为任何可比较集合编写排序方法 (Java)

java - XML 转换为 JSON 时前导零被截断