java - 将不带引号的json字符串转换为 map

标签 java json jackson mapper

我有一个 Json 格式的字符串,只是没有任何键或值被引号括起来。例如,我有这个:

String json = "{name: Bob, state: Colorado, Friends: [{ name: Dan, age: 23 }, {name: Zane, age: 24 }]}"

我希望它成为一张看起来像这样的 map :

Map<String, Object> friend1Map = new HashMap<>();
friend1Map.put("name", "Dan");
friend1Map.put("age", 23);

Map<String, Object> friend2Map = new Hashmap<>();
friend2Map.put("name", "Zane");
friend2Map.put("age", 24);

Map<String, Object> newMap = new HashMap<>();
newMap.put("name", "Bob");
newMap.put("state", "Colorado");
newMap.put("Friends", Arrays.asList(friend1Map, friend2Map));

我试过以下两种方法:

ObjectMapper mapper = new ObjectMapper();
mapper.readValue(json, new TypeReference<Map<String, Object>>() {});

这会抛出一个错误,说:

Unexpected character ('n'): was expecting double-quote to start field name

然后我尝试更改映射器的配置:

mapper.configure(JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES, true);
mapper.readValue(json, new TypeReference<Map<String, Object>>() {});

但这引发了一个错误:

com.fasterxml.jackson.core.JsonParseException: Unrecognized token 'Bob': was expecting ('true', 'false' or 'null')
at [Source: {name: Bob, state: Colorado, Friends: [{ name: Dan, age: 23 }, {name: Zane, age: 24 }]}; line: 1, column: 11]

当引号不包含在 json 字符串中时,有没有办法获取此 Map?

最佳答案

从 GSON v2.8.6 开始

带有 jackson fasterxml 的 ObjectMapper 不支持不带引号的值,但 GSON 支持:

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.google.gson.JsonParser;

.

  JsonNode json = json("{"
      + "  name: Bob,      "
      + "  state: Colorado,"
      + "  Friends: [      "
      + "    {"
      + "      name: Dan,  "
      + "      age: 23     "
      + "    },"
      + "    {"
      + "      name: Zane, "
      + "      age: 24     "
      + "     }"
      + "  ],"
      + "  extra: \"text with spaces or colon(:) must be quoted\""
      + "}");

  Map m = new ObjectMapper().convertValue(json, Map.class);

.

JsonNode json(String content) throws IOException {

  String canonicalFormat = JsonParser.parseString(content).toString();
  return json.readTree(canonicalFormat);
}

早期的 GSON

在 v2.8.6 之前,GSON 没有静态的 parseString 方法。所以你应该使用(在更高版本中不推荐使用)实例方法:

JsonNode json(String content) throws IOException {

  String canonicalFormat = new JsonParser().parse(content).toString();
  return json.readTree(canonicalFormat);
}

自 Java 15 起

注意:我们预计 Java 15 将按原样支持未转义的双引号:

var json = """
        {"name": "Bob", "state": "Colorado", "Friends": [{ "name": "Dan", "age": 23 }, {"name": "Zane", "age": 24 }]} """;

more details

关于java - 将不带引号的json字符串转换为 map ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36582892/

相关文章:

java - 启用 Pro Guard Jackson 解析器后不起作用

json - Angular HttpClient 错误处理困难

java - Spring Data REST + Hibernate 5 + Jackson LAZY 序列化失败

java - 二值图像数据的高效存储

java - 如何配置 Chrome 的 Java 插件,使其使用机器中现有的 JDK

java - 如何在JSP页面中动态插入带有复选框的标签?

java - 在 Java 中定义多线程

java - 如何从 jersey2 客户端获取 list<String> 作为响应

javascript - 选择 JSON 返回的 html 标记内的 data-id 值

java - Jackson 将动态 json 转换为 map