开源项目

知识点

相关文章

更多

最近更新

更多

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]


相关问答

更多

Jackson ObjectMapper和JsonGenerator - 它是线程安全的吗?(Jackson ObjectMapper & JsonGenerator - is it thread-safe?)

Jackson的ObjectMapper在每个序列化请求上创建一个新的JsonGenerator 。 从这个意义上说,它保证是线程安全的。 我能看到的唯一可能导致你看到的行为的是你的CustomSerializer是否有一些它正在共享的实例字段,并且正在进行某种内部同步。 Jackson's ObjectMapper creates a new JsonGenerator on each request for serialization. In that sense, it is guarant ...

REST流式JSON输出(REST Streaming JSON Output)

它看起来像客户端没有正确实现:使用解析器读取对象的数组。 另外,我想推荐读取和写入数据传输对象,而不是低级别字段逐字读写。 为了完整起见,下面是一个完整的草案示例:Jersey 2.25.1,Jetty 9.2.14.v20151106。 共同 ResponseData类 import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; public ...

Android JSONParser,httpclient和cookies(Android JSONParser, httpclient and cookies)

DefaultHttpClient处理开箱即用的cookie,您只需要重用相同的客户端,而不是为每个请求创建新的客户端。 DefaultHttpClient handles cookies out of the box you just need to reuse same client instead of creating new one for each request.

为什么我的jsonParser使用Streaming API会占用更多内存(why my jsonParser using Streaming API use much more memory)

如果您解释了您要实现的目标,那将会有所帮助。 例如,你是否绝对需要内存中的所有值? 或者是否可以一次处理一个值,并避免使用所有键值构建Map 。 如果没有解释你想要在那里做什么,你的第二次尝试没有多大意义; 但基本上使用的内存量应该是值POJO,键和包含它们的Map空间。 这可能不仅仅是输入JSON或更少,但它实际上取决于您正在处理的内容类型。 例如,字符串将占用JVM中的内存内存而不是JSON文件:UTF-8中的大多数字符都是单字节,而JVM中的每个char都是16位值(UCS-2编码)。 此外 ...

JSON - 使用jackson库解析无效的终止字符串(JSON - Parse invalid terminated string using jackson library)

根据https://github.com/FasterXML/jackson-core/issues/118,只需添加: JsonParser.ALLOW_TRAILING_COMMA 查看更多信息: https : //github.com/FasterXML/jackson-core/issues/323 According to https://github.com/FasterXML/jackson-core/issues/118 just add: JsonParser.ALLOW_T ...

如何从jackson流式传输json内容到org.apache.http.entity.InputStreamEntity?(How stream json content from jackson to org.apache.http.entity.InputStreamEntity?)

可能有使用来自JDK的PipedInputStream / PipedOutputStream的解决方案,但我想在HTTPClient的API中从InputStreamEntity为EntityTemplate会更简单。 EntityTemplate是一个与ContentProducer一起使用的HTTP实体, ContentProducer的唯一方法是writeTo(OutputStream) 。 这样,您就不必桥接输入和输出流。 new EntityTemplate(new ContentPr ...

避免使用Jackson自定义JsonSerializer和JsonGenerator序列化空字段(Avoid Serializing null fields with Jackson custom JsonSerializer and JsonGenerator)

这个问题有点开放,因为我到目前为止还不知道你到底尝试了什么; 自定义序列化程序完成了多少工作。 通常,序列化器应该委托大部分处理来最小化它们的工作量。 但是,如果您已经定义了一个自定义序列化程序来处理包含字段的POJO(而不是序列化为JSON字符串或其他标量值的自定义序列化程序),是的,您确实需要处理自己的检查。 部分原因是有很多方法可以改变包容性; 不仅是SerializationFeature ,还有@JsonFormat属性的注释; 将控件委派给自定义序列化程序时,无法透明地处理此问题。 所 ...

寻找JsonParser依赖(Looking for JsonParser dependency)

如果您使用的是maven,则可以添加以下依赖项 <dependency> <groupId>javax</groupId> <artifactId>javaee-api</artifactId> <version>7.0</version> </dependency> 你也可以在这里手动下载人工制品 http://central.maven.org/maven2/javax/javaee-api/7.0/javaee-api-7.0.jar 对于Gradle,请使用 compi ...

Jackson JsonParser获得Array令牌(Jackson JsonParser get Array token)

你可以尝试这样的事情。 private static void parse(String json) throws IOException { ObjectMapper objectMapper = new ObjectMapper(); JsonParser parser = new JsonFactory().createJsonParser(json); while (parser.nextToken() != JsonToken.END_OBJECT) { ...

JSONParser在Android应用程序中显示错误(JSONParser showing error in android app)

如果需要解析JSON字符串,则不需要使用任何JSONParser类。 JSONObject本身可用于解析JSON。 将JSON字符串传递给新的JSON对象,如下所示: JSONObject responseObject = new JSONObject(response); //response is the JSON string that you get as response String name = responseObject.get("name"); 类似地,您可以直接从respo ...