来源:字节一面

题目

实现一个方法,找到json字符串的对应路径的值。我们假设json中没有复杂结构,只存在数字、字符串。

输入:一个Json格式的字符串和一个路径字符串

输出:对应路径的值

例子:

输入:”{“a”:{“b”:1},”c”:1}” “a.b”

输出:1

解析

分析:主要考字符串处理和递归,主要思路为将输入的字符串转化成哈希表,便于查找,然后递归进行哈希表键值对的插入,然后处理路径,一层一层找即可。

import java.util.*;

public class Main{
public static Map<String, Object> parseJson(String json) {
// 字符串处理,去掉前后空格和大括号
json = json.trim();
Map<String, Object> map = new HashMap<>();
json = json.substring(1, json.length() - 1).trim();
if (json.isEmpty()) return map;

// 分割键值对
List<String> pairs = new ArrayList<>();
int brace = 0;
StringBuilder sb = new StringBuilder();
for (char c : json.toCharArray()) {
if (c == '{') brace++;
if (c == '}') brace--;
// brace=0说明在最外层,遇到逗号才拆分
if (c == ',' && brace == 0) {
pairs.add(sb.toString().trim());
sb.setLength(0);
} else {
sb.append(c);
}
}
if (!sb.isEmpty()) pairs.add(sb.toString().trim());

// 把每个键值对变成map映射
for (String pair : pairs) {
String[] kv = pair.split(":", 2); // 只在第一个冒号分割
String key = kv[0].trim().replaceAll("\"", "");
String value = kv[1].trim();
Object v;
if (value.startsWith("{")) {
v = parseJson(value); // 递归解析
} else if (value.startsWith("\"") && value.endsWith("\"")) {
v = value.substring(1, value.length() - 1); // 字符串
} else {
v = Integer.parseInt(value); // 假设都是数字
}
map.put(key, v);
}
return map;
}

public static Object getValue(String json, String path){
Map<String, Object> map = parseJson(json);
// 拆分路径
String[] keys = path.trim().split("\\.");
Object cur = map;
for (String key : keys) {
if (!(cur instanceof Map)) return null;
cur = ((Map<?, ?>) cur).get(key);
if (cur == null) return null;
}
return cur;
}

// 主函数读入字符串
public static void main(String[] args) {
Scanner scanf = new Scanner(System.in);
String json = scanf.nextLine();
String path = scanf.nextLine();
System.out.println("结果:" + getValue(json, path));
}
}