【问题标题】:How to prevent redundant string conversion step when parsing with jackson?用jackson解析时如何防止多余的字符串转换步骤?
【发布时间】:2013-12-21 23:01:56
【问题描述】:

我有一些代码可以将安静的响应转换为递归结构。但是,我想解析成树的内容被包装到“treeprop”属性中。有没有更方便的方式解析真实内容?

ObjectMapper mapper = new ObjectMapper();
JsonFactory jfac = new JsonFactory();
JsonParser jp = jfac.createParser(inputStream);
JsonNode rootNode = mapper.readTree(jp);

JsonNode path = rootNode.path("treeprop");
String realContent = mapper.writeValueAsString(path);

MyTree mt = mapper.readValue(realContent, MyTree.class);
inputStream.close();

请注意,解析本身不是这里的问题。上面的代码确实将 inputStream 正确地转换为树。但是,json 通常大于 1MB,因此将其临时存储在 String 中不能提高运行时效率。

{
  "treeprop": {
    "id": 0,
    "children": [
      {
        "id": 2,
        "children": [
          {
            "id": 3,
            "children": []
          },
          {
            "id": 4,
            "children": []
          }
        ]
      },
      {
        "id": 1,
        "children": []
      }
    ]
  }
}

这个类看起来大致是这样的

class MyTree {
   public Integer id;
   public List<MyTree> children;
}

所以真正的问题是:是否有更有效的替代方案来实现相同的效果:

JsonNode path = rootNode.path("treeprop");
String realContent = mapper.writeValueAsString(path);
MyTree mt = mapper.readValue(realContent, MyTree.class);

【问题讨论】:

  • 更多信息在这里会有所帮助 - 首先,您尝试解析的 json 输入示例;第二 - MyTree 类。
  • 看看这个答案,我相信它会满足您的需求。 -> stackoverflow.com/questions/20635220/…

标签: java json jackson


【解决方案1】:
public class MyTreeWrapper {
    private MyTree treeprop;

    // getter, setter
}

...

ObjectMapper mapper = new ObjectMapper();
MyTreeWrapper wrapper = mapper.readValue(inputStream, MyTreeWrapper.class);
MyTree tree = wrapper.getTreeprop();

替代方案:

MyTree tree = mapper.reader(MyTree.class).readValue(rootNode.path("treeprop"));

【讨论】:

    猜你喜欢
    • 2021-04-13
    • 1970-01-01
    • 1970-01-01
    • 2016-01-06
    • 1970-01-01
    • 1970-01-01
    • 2020-12-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多