需求
Java方法实现以data.info.author.name,value
格式做传入参数读取json深层次的信息,而不用一级一级地去遍历Json对象。
代码实现
方法代码
import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONObject;public static String getValueByPath(JSONObject json, String path) {if (json == null || path == null) {return null;}String[] keys = path.split("\\.");JSONObject currentNode = json;for (String key : keys) {if (currentNode.containsKey(key)) {Object value = currentNode.get(key);if (value instanceof JSONObject) {currentNode = (JSONObject) value;} else {// 当遇到非JSONObject时,返回当前层级的值return value.toString();}} else {// 如果路径中的key不存在,则返回nullreturn null;}}// 返回最深层次的值return JSON.toJSONString(currentNode);}
参数说明
这个方法中传参的json是使用com.alibaba.fastjson解析后的JSON对象,不是字符串:
JSONObject json= JSON.parseObject(jsonStr);
使用的依赖
<dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>2.0.9.graal</version></dependency>
测试效果
假设有一json字符串是这样的多级结构:
使用本方法获取的示例代码是:
public class UtilsTest {// 使用示例public static void main(String[] args) {String jsonStr = "{\"data\":{\"info\":{\"author\":{\"name\":{\"value\":\"Kelvin,Welcome to 1024!\"}}}}}";JSONObject jsonObject = JSON.parseObject(jsonStr);String value = FileUtils.getValueByPath(jsonObject, "data.info.author.name.value");System.out.println("Get INFO: " + value); // 输出GET INFO: Kelvin,Welcome to 1024!}
}
查询结果: