【问题标题】:Convert nested JSON string to list of java object将嵌套的 JSON 字符串转换为 java 对象的列表
【发布时间】:2018-02-13 08:48:24
【问题描述】:

我有这个 json 字符串

{"data":"[Level [key=LevelKey [keyEnd=0], Description=abc], Level [key=levelKey [keyEnd=1], Description=xyz]", "id":"123"}

而对应的java类是

public class Level {
  public LevelKey key;
  public String id;
 }


 public class LevelKey{
 public String keyEnd;
 }

我想使用 Jackson 将此 data json 字符串转换为 Level 对象列表

 ObjectMapper mapper = new ObjectMapper();
    List<Level> arr = mapper.readValue(data, new TypeReference<List<Level>>(){});

但是我遇到了错误

com.fasterxml.jackson.core.JsonParseException: Unrecognized token 'Level': was expecting ('true', 'false' or 'null')

还有其他方法可以解析吗?

【问题讨论】:

  • "[Level [key=LevelKey [keyEnd=0], Description=abc], Level [key=levelKey [keyEnd=1], Description=xyz]" 的部分不是有效的 json,而是整个字符串,您必须自己解析它,即编写一个可以提取所有值的类,例如 key , keyEndDescription 到变量

标签: java json parsing jackson


【解决方案1】:

下面看起来不像是一个合适的 JSON(除了标准的固定字符串)

"[Level [key=LevelKey [keyEnd=0], Description=abc], Level [key=levelKey [keyEnd=1], Description=xyz]"

您可以将 JSON 的数据部分更正为如下所示(最接近您的 JSON):

[\"Level [key=LevelKey [keyEnd=0], Description=abc]\",\" Level [key=levelKey [keyEnd=1], Description=xyz]\"]

还有其他方法可以解析吗?

您可以使用ArrayList 的直接类引用,而不必像下面那样实例化TypeReference 来解析上述(更正后的)json 字符串:

List<Level> arr = mapper.readValue(data, (new ArrayList<Level>()).getClass());

【讨论】:

    【解决方案2】:

    我必须说这是一件有趣的事。看看代码 sn-p 我想我猜对了:

    String data ="{\"data\":\"[Level [key=LevelKey [keyEnd=0], Description=abc], Level [key=levelKey [keyEnd=1], Description=xyz]\", \"id\":\"123\"}";
    ObjectMapper mapper = new ObjectMapper();
    mapper.configure(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY, true);
    List<Level> arr = mapper.readValue(data, (new ArrayList<Level>()).getClass());
    System.out.println(arr);
    

    我得到以下输出:

    [{data=[Level [key=LevelKey [keyEnd=0], Description=abc], Level [key=levelKey [keyEnd=1], Description=xyz], id=123}]
    

    此外,如果您遇到任何 JsonParseException,根据文档意味着:

    解析问题的异常类型,当内容格式不正确时使用 (根据规范不符合 JSON 语法的内容)是 遇到过。

    因此,在破解 JSON 时,您可以像这样更新 ObjectMapper 对象:

    mapper.configure(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY, true);
    

    正如 Exception_al 所提到的,它使用 ArrayList 的直接类引用,而不是像下面那样实例化 TypeReference 来解析上述(更正)的 json 字符串。

    List<Level> arr = mapper.readValue(data, (new ArrayList<Level>()).getClass());
    

    希望这会有所帮助。

    【讨论】:

      【解决方案3】:

      字符串不是您期望反序列化为 JAVA 的 JSON 表示形式。
      这是一个 JSON 字符串:

      "{"data":[{"key":{"keyEnd":0},"Description":"abc"},{"key":{"keyEnd":1},"Description":"abc"}],"id":"123"}"
      

      所以,要么是字符串有问题,要么你需要自己进行解析。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-02-05
        • 2016-02-08
        • 1970-01-01
        • 2018-05-01
        • 2021-11-25
        • 2022-01-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多