【问题标题】:Getting entire JSON object with Jackson parser使用 Jackson 解析器获取整个 JSON 对象
【发布时间】:2012-08-14 10:48:36
【问题描述】:

有了 GSON,我可以写这个

JsonStreamParser parser = new JsonStreamParser(reader);
System.out.println(parser.next());

如果流由 JSON 对象组成,它会将整个对象打印为字符串。

有没有一种简单的方法可以用 Jackson 做到这一点,还是我需要使用我在示例中看到的 while 循环模式?

所以如果第一个对象是: { “身份证”:1, “名称”:“Foo”, “价格”:123, “标签”:[“酒吧”,“Eek”], “股票”: { “仓库”:300, “零售”:20 } }

打印的第一行是:

{"id": 1,"name": "Foo","price": 123,"tags": [ "Bar", "Eek" ],"stock": {"warehouse": 300,"零售”:20}}

【问题讨论】:

  • 为什么这被否决了。据我从常见问题解答中可以看出,这个问题属于这里。

标签: java json parsing jackson gson


【解决方案1】:

在流模式下,每个 JSON “字符串”都被视为单个令牌,并且每个令牌都将被增量处理,这就是我们称之为“增量模式”的原因。例如,

{
   "name":"mkyong"
}
Token 1 = “{“
Token 2 = “name”
Token 3 = “mkyong”
Token 4 = “}”

你可以编写如下代码来解析上面的json文本

import java.io.File;
import java.io.IOException;
import org.codehaus.jackson.JsonFactory;
import org.codehaus.jackson.JsonGenerationException;
import org.codehaus.jackson.JsonParser;
import org.codehaus.jackson.JsonToken;
import org.codehaus.jackson.map.JsonMappingException;

public class JacksonStreamExample {
   public static void main(String[] args) {

     try {

    JsonFactory jfactory = new JsonFactory();

    /*** read from file ***/
    JsonParser jParser = jfactory.createJsonParser(new File("c:\\user.json"));

    // loop until token equal to "}"
    while (jParser.nextToken() != JsonToken.END_OBJECT) {

        String fieldname = jParser.getCurrentName();
        if ("name".equals(fieldname)) {

          // current token is "name",
                  // move to next, which is "name"'s value
          jParser.nextToken();
          System.out.println(jParser.getText()); // display mkyong

        }

        if ("age".equals(fieldname)) {

          // current token is "age", 
                  // move to next, which is "name"'s value
          jParser.nextToken();
          System.out.println(jParser.getIntValue()); // display 29

        }

        if ("messages".equals(fieldname)) {

          jParser.nextToken(); // current token is "[", move next

          // messages is array, loop until token equal to "]"
          while (jParser.nextToken() != JsonToken.END_ARRAY) {

                     // display msg1, msg2, msg3
             System.out.println(jParser.getText()); 

          }

        }

      }
      jParser.close();

     } catch (JsonGenerationException e) {

      e.printStackTrace();

     } catch (JsonMappingException e) {

      e.printStackTrace();

     } catch (IOException e) {

      e.printStackTrace();

     }

  }

}

输出

mkyong 29

味精1

味精2

味精 3

【讨论】:

  • 我发布这个问题的原因是因为 GSON 会给我这个:{"name":"mkyong"},这就是我想要的。从您的回复中可以看出,Jackson 比 GSON 复杂得多,我正在寻找一种简单的方法。
  • 这个输出:{"name":"mkyong"}
  • 这不是原始问题的答案。它不允许获取整个嵌套的 json。
猜你喜欢
  • 1970-01-01
  • 2014-12-22
  • 1970-01-01
  • 2016-12-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多