- Jackson介绍
- Jackson入门程序
- Jackson ObjectMapper实现JSON实际的读/写
- Jackson对象序列化/反系列化
- Jackson数据绑定
- Jackson JSON映射到任何Java对象
- Jackson使用具体的Java对象和类型强制转换到JSON使用
- Jackson树模型JsonNode
- Jackson流式API JsonGenerator、JsonParser
开源项目
知识点
相关文章
更多最近更新
更多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?)[2022-10-07]
Jackson的ObjectMapper在每个序列化请求上创建一个新的JsonGenerator 。 从这个意义上说,它保证是线程安全的。 我能看到的唯一可能导致你看到的行为的是你的CustomSerializer是否有一些它正在共享的实例字段,并且正在进行某种内部同步。 Jackson's ObjectMapper creates a new JsonGenerator on each request for serialization. In that sense, it is guaranteed t ... -
REST流式JSON输出(REST Streaming JSON Output)[2022-07-26]
它看起来像客户端没有正确实现:使用解析器读取对象的数组。 另外,我想推荐读取和写入数据传输对象,而不是低级别字段逐字读写。 为了完整起见,下面是一个完整的草案示例:Jersey 2.25.1,Jetty 9.2.14.v20151106。 共同 ResponseData类 import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; public clas ... -
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)[2023-05-23]
如果您解释了您要实现的目标,那将会有所帮助。 例如,你是否绝对需要内存中的所有值? 或者是否可以一次处理一个值,并避免使用所有键值构建Map 。 如果没有解释你想要在那里做什么,你的第二次尝试没有多大意义; 但基本上使用的内存量应该是值POJO,键和包含它们的Map空间。 这可能不仅仅是输入JSON或更少,但它实际上取决于您正在处理的内容类型。 例如,字符串将占用JVM中的内存内存而不是JSON文件:UTF-8中的大多数字符都是单字节,而JVM中的每个char都是16位值(UCS-2编码)。 此外,虽然JS ... -
JSON - 使用jackson库解析无效的终止字符串(JSON - Parse invalid terminated string using jackson library)[2023-01-13]
根据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_TRAILI ... -
可能有使用来自JDK的PipedInputStream / PipedOutputStream的解决方案,但我想在HTTPClient的API中从InputStreamEntity为EntityTemplate会更简单。 EntityTemplate是一个与ContentProducer一起使用的HTTP实体, ContentProducer的唯一方法是writeTo(OutputStream) 。 这样,您就不必桥接输入和输出流。 new EntityTemplate(new ContentProduce ...
-
这个问题有点开放,因为我到目前为止还不知道你到底尝试了什么; 自定义序列化程序完成了多少工作。 通常,序列化器应该委托大部分处理来最小化它们的工作量。 但是,如果您已经定义了一个自定义序列化程序来处理包含字段的POJO(而不是序列化为JSON字符串或其他标量值的自定义序列化程序),是的,您确实需要处理自己的检查。 部分原因是有很多方法可以改变包容性; 不仅是SerializationFeature ,还有@JsonFormat属性的注释; 将控件委派给自定义序列化程序时,无法透明地处理此问题。 所以,是的, ...
-
如果您使用的是maven,则可以添加以下依赖项
javax javaee-api 7.0 -
你可以尝试这样的事情。 private static void parse(String json) throws IOException { ObjectMapper objectMapper = new ObjectMapper(); JsonParser parser = new JsonFactory().createJsonParser(json); while (parser.nextToken() != JsonToken.END_OBJECT) { S ...
-
如果需要解析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"); 类似地,您可以直接从responseOb ...