Jackson流式API JsonGenerator、JsonParser

2019-05-09 23:40|来源: 网路

流式API读取和写入JSON内容离散事件。 JsonParser读取数据,而JsonGenerator写入数据。它是三者中最有效的方法,是最低开销和最快的读/写操作。它类似于XML的Stax解析器。

在本文中,我们将展示的使用Jackson的流式API 读写JSON数据。流式API工作使用JSON为每一个细节的都是要小心处理。下面的例子将使用两个类:

  • JsonGenerator - 写入JSON字符串。

  • JsonParser - 解析JSON字符串。

使用JsonGenerator写入JSON

使用JsonGenerator是非常简单的。首先使用JsonFactory.createJsonGenerator()方法创建一个JsonGenerator,并用write***()方法来写每一个JSON值。

JsonFactory jasonFactory = new JsonFactory();
JsonGenerator jsonGenerator = jasonFactory.createJsonGenerator(new File(
   "student.json"), JsonEncoding.UTF8);
// {
jsonGenerator.writeStartObject();
// "name" : "Mahesh Kumar"
jsonGenerator.writeStringField("name", "Mahesh Kumar");

让我们来看看JsonGenerator操作。创建一个名为JacksonTester的Java类文件在目录 C:\>Jackson_WORKSPACE.

File: JacksonTester.java

import java.io.File;
import java.io.IOException;
import java.util.Map;

import org.codehaus.jackson.JsonEncoding;
import org.codehaus.jackson.JsonFactory;
import org.codehaus.jackson.JsonGenerator;
import org.codehaus.jackson.JsonParseException;
import org.codehaus.jackson.map.JsonMappingException;
import org.codehaus.jackson.map.ObjectMapper;

public class JacksonTester {
   public static void main(String args[]){
      JacksonTester tester = new JacksonTester();
      try {        	
         JsonFactory jasonFactory = new JsonFactory();

         JsonGenerator jsonGenerator = jasonFactory.createJsonGenerator(new File(
            "student.json"), JsonEncoding.UTF8);
         // {
         jsonGenerator.writeStartObject();
         // "name" : "Mahesh Kumar"
         jsonGenerator.writeStringField("name", "Mahesh Kumar"); 
         // "age" : 21
         jsonGenerator.writeNumberField("age", 21);
         // "verified" : false
         jsonGenerator.writeBooleanField("verified", false); 
         // "marks" : [100, 90, 85]
         jsonGenerator.writeFieldName("marks"); 
         // [
         jsonGenerator.writeStartArray(); 
         // 100, 90, 85
         jsonGenerator.writeNumber(100); 
         jsonGenerator.writeNumber(90); 
         jsonGenerator.writeNumber(85); 
         // ]
         jsonGenerator.writeEndArray(); 
         // }
         jsonGenerator.writeEndObject(); 
         jsonGenerator.close();       	 

         //result student.json
         //{ 
         //   "name":"Mahesh Kumar",
         //   "age":21,
         //   "verified":false,
         //   "marks":[100,90,85]
         //}
         ObjectMapper mapper = new ObjectMapper();
         Map<String,Object> dataMap = mapper.readValue(new File("student.json"), Map.class);

         System.out.println(dataMap.get("name"));
         System.out.println(dataMap.get("age"));
         System.out.println(dataMap.get("verified"));
         System.out.println(dataMap.get("marks"));
      } catch (JsonParseException e) {
         e.printStackTrace();
      } catch (JsonMappingException e) {
         e.printStackTrace();
      } catch (IOException e) {
         e.printStackTrace();
      }
   }
}

验证结果

使用javac编译如下类:

C:\Jackson_WORKSPACE>javac JacksonTester.java

现在运行jacksonTester看到的结果:

C:\Jackson_WORKSPACE>java JacksonTester

验证输出

Mahesh Kumar
21
false
[100, 90, 85]

使用JsonParser 读取JSON

使用JsonParser是非常简单的。首先使用JsonFactory.createJsonParser()方法创建JsonParser,并使用它的nextToken()方法来读取每个JSON字符串作为标记。检查每个令牌和相应的过程。

JsonFactory jasonFactory = new JsonFactory();
JJsonParser jsonParser = jasonFactory.createJsonParser(new File("student.json"));
while (jsonParser.nextToken() != JsonToken.END_OBJECT) {
   //get the current token
   String fieldname = jsonParser.getCurrentName();
   if ("name".equals(fieldname)) {
      //move to next token
      jsonParser.nextToken();
      System.out.println(jsonParser.getText());        	 
   }
}

让我们来看看JsonParser的操作。创建一个名为JacksonTester在Java类在文件夹 C:\>Jackson_WORKSPACE.

文件: JacksonTester.java

import java.io.File;
import java.io.IOException;

import org.codehaus.jackson.JsonEncoding;
import org.codehaus.jackson.JsonFactory;
import org.codehaus.jackson.JsonGenerator;
import org.codehaus.jackson.JsonParseException;
import org.codehaus.jackson.JsonParser;
import org.codehaus.jackson.JsonToken;
import org.codehaus.jackson.map.JsonMappingException;

public class JacksonTester {
   public static void main(String args[]){
      JacksonTester tester = new JacksonTester();
      try {        	
         JsonFactory jasonFactory = new JsonFactory();

         JsonGenerator jsonGenerator = jasonFactory.createJsonGenerator(new File(
            "student.json"), JsonEncoding.UTF8);
         jsonGenerator.writeStartObject();
         jsonGenerator.writeStringField("name", "Mahesh Kumar"); 
         jsonGenerator.writeNumberField("age", 21);
         jsonGenerator.writeBooleanField("verified", false); 
         jsonGenerator.writeFieldName("marks"); 
         jsonGenerator.writeStartArray(); // [
         jsonGenerator.writeNumber(100); 
         jsonGenerator.writeNumber(90); 
         jsonGenerator.writeNumber(85); 
         jsonGenerator.writeEndArray(); 
         jsonGenerator.writeEndObject(); 
         jsonGenerator.close();       	 

         //result student.json
         //{ 
         //   "name":"Mahesh Kumar",
         //   "age":21,
         //   "verified":false,
         //   "marks":[100,90,85]
         //}

         JsonParser jsonParser = jasonFactory.createJsonParser(new File("student.json"));
         while (jsonParser.nextToken() != JsonToken.END_OBJECT) {
            //get the current token
            String fieldname = jsonParser.getCurrentName();
            if ("name".equals(fieldname)) {
               //move to next token
               jsonParser.nextToken();
               System.out.println(jsonParser.getText());        	 
            }
            if("age".equals(fieldname)){
               //move to next token
               jsonParser.nextToken();
               System.out.println(jsonParser.getNumberValue());        	 
            }
            if("verified".equals(fieldname)){
               //move to next token
               jsonParser.nextToken();
               System.out.println(jsonParser.getBooleanValue());        	 
            }
            if("marks".equals(fieldname)){
               //move to [ 
               jsonParser.nextToken();
               // loop till token equal to "]"
               while (jsonParser.nextToken() != JsonToken.END_ARRAY) {
                  System.out.println(jsonParser.getNumberValue()); 
               }
            }
         }
      } catch (JsonParseException e) {
         e.printStackTrace();
      } catch (JsonMappingException e) {
         e.printStackTrace();
      } catch (IOException e) {
         e.printStackTrace();
      }
   }
}

验证结果

编译使用javac编译如下类:

C:\Jackson_WORKSPACE>javac JacksonTester.java

现在运行 jacksonTester 看到结果如下:

C:\Jackson_WORKSPACE>java JacksonTester

验证输出

Mahesh Kumar
21
false
[100, 90, 85]


相关问答

更多

Arch Linux中没有OpenGL 3标头(No OpenGL 3 headers in Arch Linux)

你不需要GL3.h,GL3.h只是摆脱了所有弃用的功能。 所以只需要包含gl.h而不是gl3.h 下载和手动copyieng到/usr/include/GL/不是一个真正的解决方案,它的工作原理是肯定的,但如果添加到mesa包中的gl3.h怎么gl3.h ? 你是包经理会发现冲突。 最好将gl3.h添加到项目或主目录中,并将其添加到$ PATh或使用-I标志。 You don't need a GL3.h, the GL3.h just got rid of all deprecated fea

前台服务被Android杀死(Foreground service being killed by Android)

对。 我已经经历了这个问题。 以下是如何继续操作。 有bug 这篇文章描述了如何分析实现中的错误并解决问题。 总而言之,这是事情应该如何工作。 运行中的服务将每隔30分钟一次清理并终止。 希望保持更长时间的服务必须调用Service.startForeground,该通知栏会在通知栏上发出通知,以便用户知道您的服务是永久运行的,并可能吸取电池的使用寿命。 在任何给定的时间,只有3个服务流程可以提名自己作为前台服务。 如果有三个前台服务,Android将提名最旧的服务作为清理和终止的候选人。 不幸

在javascript /浏览器中缓存jquery ajax响应(Caching a jquery ajax response in javascript/browser)

cache:true仅适用于GET和HEAD请求。 你可以按照你所说的方式滚动自己的解决方案: var localCache = { data: {}, remove: function (url) { delete localCache.data[url]; }, exist: function (url) { return localCache.data.hasOwnProperty(url) && localCache.dat

Golang - 删除Route53记录(Golang - Delete Route53 Record)

再次感谢Imperalix提示。 基本思想是使用用于创建记录的确切参数。 这是我现在正在删除CNAME记录的工作。 func deleteRecord(svc *route53.Route53) { dnsName := "vikas027.something.net" request := &route53.ChangeResourceRecordSetsInput{ ChangeBatch: &route53.ChangeBatch{

什么会阻止AngularJS $ cookies写一个cookie?(What would prevent AngularJS $cookies from writing a cookie?)

事实证明,Angular $ cookies正在编写cookie,但我们遇到了域/路径问题。 由于我们的Angular应用程序位于我们的后端应用程序目录之外,因此页面URL与服务器路径不匹配。 如果我访问了实际路径,而页面没有正确加载,则cookie存在。 我们使用此域/路径配置解决了该问题: $cookies.put('myCookie', true, { domain: '.mydomain.com', path: currentUrl, expires: exp }

相关文章

更多

最近更新

更多