【Java / Hutool / JSON】多层嵌套的JSON数据,如何优雅地put和get?

1.示例JSON数据

给你一个形如下面的多层嵌套的JSON数据,你现在准备怎么put和get值其中的【content】字段的值呢?

{
    "messages": [{
        "role": "user",
        "content": "生成快速排序算法"
    }],
    "model": "ziya-coding-34b",
    "max_tokens": 8192,
    "stream": true
}

2.用Hutool之前以前


我可能会如下操作,有的朋友看了可能会笑,但我真的这么干过:

    public static void main(String[] args) {
        String jsonStr = "{\n" +
                "    \"messages\": [{\n" +
                "        \"role\": \"user\",\n" +
                "        \"content\": \"生成快速排序算法\"\n" +
                "    }],\n" +
                "    \"model\": \"ziya-coding-34b\",\n" +
                "    \"max_tokens\": 8192,\n" +
                "    \"stream\": true\n" +
                "}";
        Map jsonMap = JSONUtil.toBean(jsonStr, Map.class);
        List list = (List)jsonMap.get("messages");
        Map o = (Map)list.get(0);
        String content = o.get("content").toString();
        System.out.println("content的值为:".concat(content));
    }

如果你还在这么干,别怕,Hutool会出手。在项目中引入依赖:

        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>5.8.23</version>
        </dependency>

3.用Hutool之后

使用JsonObject对象的getByPathsetByPath方法,参数传入一个表达式。

表达式解释:

"messages.0.content"

  • messages:Map的key,该key对应的值是一个列表,获得的内容如下:
[{
        "role": "user",
        "content": "生成快速排序算法"
}],
  • 0:索引值,获取上一级列表对象的索引为0的元素,获得的内容如下:
{
        "role": "user",
        "content": "生成快速排序算法"
}
  • content:Map的key,获得目标key对应的值【生成快速排序算法】

现在获取content的值只需要一行代码:

①获取值:

        String jsonStr = "{\n" +
                "    \"messages\": [{\n" +
                "        \"role\": \"user\",\n" +
                "        \"content\": \"生成快速排序算法\"\n" +
                "    }],\n" +
                "    \"model\": \"ziya-coding-34b\",\n" +
                "    \"max_tokens\": 8192,\n" +
                "    \"stream\": true\n" +
                "}";

        JSONObject jsonObject = JSONUtil.parseObj(jsonStr);
        String content = jsonObject.getByPath("messages.0.content").toString();

②设置值:

        String jsonStr = "{\n" +
                "    \"messages\": [{\n" +
                "        \"role\": \"user\",\n" +
                "        \"content\": \"生成快速排序算法\"\n" +
                "    }],\n" +
                "    \"model\": \"ziya-coding-34b\",\n" +
                "    \"max_tokens\": 8192,\n" +
                "    \"stream\": true\n" +
                "}";

        JSONObject jsonObject = JSONUtil.parseObj(jsonStr);
        jsonObject.putByPath("messages.0.content","新值");