当前位置: 首页 > 编程笔记 >

解析Java的Jackson库中Streaming API的使用

窦宏旷
2023-03-14
本文向大家介绍解析Java的Jackson库中Streaming API的使用,包括了解析Java的Jackson库中Streaming API的使用的使用技巧和注意事项,需要的朋友参考一下

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

在本文中,我们将展示的使用Jackson的流式API 读写JSON数据。流式API工作使用JSON为每一个细节的都是要小心处理。下面的例子将使用两个类:
JsonGenerator类——写入JSON字符串。
sonGenerator是定义公共API编写的Json内容的基类。使用JsonFactory实例的工厂方法创建实例。

类声明
以下是org.codehaus.jackson.JsonGenerator类的声明:

public abstract class JsonGenerator
  extends Object
   implements Closeable

嵌套类

S.N. 类和说明
1 static class JsonGenerator.Feature//枚举定义了生成器的所有togglable功能。

字段
protected PrettyPrinter _cfgPrettyPrinter - 对象处理相当打印(通常多余的空白,使结果更加可读)输出时。

构造函数

S.N. 类和说明
1 Default constructor

JsonParser类——解析JSON字符串。
JsonParser是定义公共API用于读取的Json内容的基类。使用JsonFactory实例的工厂方法创建实例。

类声明
以下是org.codehaus.jackson.JsonParser类的声明:

public abstract class JsonParser
  extends Object
   implements Closeable, Versioned

嵌套类

S.N. 类和说明
1 static class JsonParser.Feature //枚举定义了解析器的所有togglable功能。
2 static class JsonParser.NumberType //枚举可用于数字可能的“本地”(最佳)类型。

字段

  • protected PrettyPrinter _cfgPrettyPrinter - 对象处理相当打印(通常多余的空白,使结果更加可读)输出。
  • protected JsonToken _currToken - 通过nextToken()检索最后一个令牌(如有)。
  • protected int _features - 位标志位,表明其已启用JsonParser.Features构成。
  • protected JsonToken _lastClearedToken - 最后清除令牌如果有的话:也就是值有效时clearCurrentToken()被调用。

构造函数

S.N. 类和说明
1 protected JsonParser() //默认的构造函数
2 protected JsonParser(int features)

继承的方法
这个类继承了以下类方法:

java.lang.Object


使用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]

 类似资料:
  • 我已经编写了糟糕的代码来解析上面的json数组。下面是我使用的代码, 有谁能帮助我知道使用Jackson解析JSON吗?我们非常感谢你的帮助。

  • 谁能帮我找出我在这里做错了什么。我必须解析下面的XML字符串 为此,我有三个bean要映射,如下所示 我试图像下面这样解析 我使用的是jackson-dataformat-xml版本2.9.8。

  • 在上一周我们实现了一个基本的网络爬虫,但是提取页面信息时使用的是正则表达式,这还是比较烦琐,出错率比较高。 我们爬取的信息大多都是网页信息,网页HTML节点(标签)中定义了大量的id和class属性,而且节点之间还有层级关系。 针对于上述这种格式的解析,给大家介绍几种解析库: a. XPath的使用 b. Beautiful Soup的使用 c. PyQuery的使用

  • 问题内容: 是否有用于解析SQL语句的开源Java库? 如果可能的话,它应该是可定制的或足够灵活的,以能够解析(或至少忽略)特定于供应商的语法(例如Oracle表空间定义或MySQL的LIMIT子句)。 如果没有,严格遵守SQL标准也是可以的。 更新:我需要两件事: 提供到非SQL数据库的SQL接口(映射到内部API调用) 在将SQL移至实际数据库之前(例如Oracle)重写SQL 问题答案: A

  • 本文向大家介绍使用Java中的Jackson库将CSV转换为JSON?,包括了使用Java中的Jackson库将CSV转换为JSON?的使用技巧和注意事项,需要的朋友参考一下 Jackson是一种Java JSON API,它提供了几种使用JSON的不同方式。我们可以使用CsvMapper类将CSV数据转换为JSON数据,它是专用的ObjectMapper,具有从pojo中生成CsvSchema实

  • 本文向大家介绍使用Java中的Jackson库将XML转换为POJO?,包括了使用Java中的Jackson库将XML转换为POJO?的使用技巧和注意事项,需要的朋友参考一下 该JSON杰克逊是一个Java库。它具有非常强大的数据绑定功能,并提供了一个框架,用于将自定义Java对象序列化为JSON并将JSON反序列化为Java对象。我们还可以使用XmlMapper 类的readValue()方法将

  • 本文向大家介绍使用Java中的Jackson库将POJO转换为XML?,包括了使用Java中的Jackson库将POJO转换为XML?的使用技巧和注意事项,需要的朋友参考一下 一个杰克逊 是一个基于Java的库,它可以为Java对象到JSON和JSON转换为Java对象很有用。一个杰克逊API是快于其他的API,需要更少的内存区域,对于大型物体良好。我们使用XmlMapper 类的writeVal

  • 我在通过邮递员传递json数据时遇到问题。如果Mandetory日期带有注释,没问题。另一个日期接受null。但是在更新时,该日期会产生问题。我使用Java1.8与Spring启动 以下链接我已经访问过,但不适合这个。杰克逊JSON解析错误的LocalDateTime解析:无法构造java.time.LocalDate的实例:没有String参数构造函数/工厂方法从String值反序列化https