来源:字节一面
题目
实现一个方法,找到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--; if (c == ',' && brace == 0) { pairs.add(sb.toString().trim()); sb.setLength(0); } else { sb.append(c); } } if (!sb.isEmpty()) pairs.add(sb.toString().trim());
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)); } }
|