Jackson高级操作————流式API与JsonGenerator、JsonParser

引言

继《Jackson快速入门》之后的高级相关操作。

Jackson提供了一种对于性能要求应用程序操作json更加高效的方式——流式API,这种方式开销小,性能高,因此,如果应用程序或者程序逻辑对于性能有一定要求,可以使用这种方式来进行json文件的读写操作,而对于一般的读写,使用普通的databind api即可。

要点

1、与Java8的“流式”概念不同,这种Jackson的这种流式是属于IO流,在写出与读入的最后都要进行流的关闭 —— close()

2、这种流式API(Streaming APIs),是一种高性能(high-performance)读写JSON的方式,同时也是一种增量模式(incremental mode)。

3、Token概念:使用流式API的时候,每一个JSON 字符串都是一个独立的 token 每一个token都会被增量处理(可以理解为一个一个地往上增加,类似于垒砖),这就是“增量模式”的含义。比如:

{
    "name" : "Morty"
}

Token 1 = "{"

Token 2 = "name"

Token 3 = "Morty"

Token 4 = "}"

4、流式API的缺点:虽然流式API在性能上有所特长,但是通过第三点,也可以知道,每一个token都是增量处理的,也就是说,我们必须要小心翼翼地处理每个token,这可能会因为粗心导致丢掉必要的token (如 "}"、"]" 等),而且代码可能并不简洁,可读性也不一定好,因此,不到需要考虑性能的时候,一定不要使用这种方式。

示例程序

通过Jackson Streaming APIs,写入一个json文件——“user.json”,并读出。

    @Test
    public void testJsonGenerator() throws IOException {
        JsonFactory factory = new JsonFactory();
        
        // -----------------JsonGenerator --------------------
        
        JsonGenerator gentor = factory.createGenerator(new File("user.json"), JsonEncoding.UTF8);
        gentor.writeStartObject(); // {
        gentor.writeStringField("name", "Tomson");
        gentor.writeNumberField("age", 23);
        
        gentor.writeFieldName("messages");
        gentor.writeStartArray(); // [
        gentor.writeString("msg1");
        gentor.writeString("msg2");
        gentor.writeString("msg3");
        
        gentor.writeEndArray(); // ]
        
        gentor.writeEndObject(); // }
        
        
        gentor.close();
        
        // ------------------JsonParser --------------------
        
        JsonParser parser = factory.createParser(new File("user.json"));
        
        while (parser.nextToken() != JsonToken.END_OBJECT) {
            String fieldName = parser.getCurrentName();
            if ("name".equals(fieldName)) {
                // current token is "name",move to next which is "name"'s value.
                parser.nextToken();
                System.out.println(parser.getText());// display "Tomson"
            }
            
            if ("age".equals(fieldName)) {
                parser.nextToken();
                System.out.println(parser.getIntValue());
            }
            
            if ("messages".equals(fieldName)) {
                parser.nextToken();
                // messages is array, loop until equals "]"
                
                while(parser.nextToken() != JsonToken.END_ARRAY) {
                    System.out.println(parser.getText());
                }
            }
        }
        parser.close();
    }

user.json文件内容:

程序执行输出结果:

总结

Jackson Streaming APIs是一种高性能、增量式json读写工具,在需要特殊性能要求的时候才会用到。缺点是代码不简洁,易错性高,可读性较差,可以通过jackson data binding代替。

token的概念,每一个json字符串都要被视为token,包括表示对象的大括号以及表示数组的中括号

操作结束需要关流——close()。

 

相关推荐
<p> <strong><span style="font-size:20px;color:#FF0000;">本课程主要针对计算机相关专业的正在做毕设的学生需要项目实战练习的Java学习者</span></strong> </p> <p> <span style="color:#FF0000;"><strong><span style="font-size:18px;">1. 包含:<span style="color:#FFFF00;background-color:#FF0000;">项目源码</span><span style="color:#FFFF00;background-color:#FF0000;">项目文档数据库脚本软件工具</span>等所有资料</span></strong></span> </p> <p> <span style="color:#FF0000;"><strong><span style="font-size:18px;">2. 手把手的带你从零开始部署运行本套系统</span></strong></span> </p> <p> <span style="color:#FF0000;"><strong><span style="font-size:18px;">3. 该项目附带的源码资料可作为毕设使用</span></strong></span> </p> <p> <span style="color:#FF0000;"><strong><span style="font-size:18px;">4. 提供技术答疑和远程协助指导</span></strong></span><strong><span style="font-size:18px;"></span></strong> </p> <p> <br /> </p> <p> <span style="font-size:18px;"><strong>项目运行截图:</strong></span> </p> <p> <strong><span style="font-size:18px;">1)系统登陆界面</span></strong> </p> <p> <strong><span style="font-size:18px;"><img src="https://img-bss.csdn.net/202002241015433522.png" alt="" /><br /> </span></strong> </p> <p> <strong><span style="font-size:18px;"><strong><span style="font-size:18px;">2)学生模块</span></strong></span></strong> </p> <p> <strong><span style="font-size:18px;"><img src="https://img-bss.csdn.net/202002241015575966.png" alt="" /></span></strong> </p> <p> <strong><span style="font-size:18px;"><strong><span style="font-size:18px;">3)教师模块</span></strong></span></strong> </p> <p> <strong><span style="font-size:18px;"><img src="https://img-bss.csdn.net/202002241016127898.png" alt="" /></span></strong> </p> <p> <strong><span style="font-size:18px;"><strong><span style="font-size:18px;">4)系统管理员</span></strong></span></strong> </p> <p> <strong><span style="font-size:18px;"><img src="https://img-bss.csdn.net/202002241016281177.png" alt="" /></span></strong> </p> <p> <strong><span style="font-size:18px;"><img src="https://img-bss.csdn.net/202002241016369884.png" alt="" /></span></strong> </p> <p> <strong><span style="font-size:18px;"><br /> </span></strong> </p> <p> <strong><span style="font-size:18px;"><strong><span style="font-size:18px;">更多Java毕设项目请关注我的毕设系列课程 <a href="https://edu.csdn.net/lecturer/2104">https://edu.csdn.net/lecturer/2104</a></span></strong></span></strong> </p> <p> <strong><span style="font-size:18px;"><br /> </span></strong> </p>
<p> 课程演示环境:Windows10  </p> <p> 需要学习<span>Ubuntus</span>系统<span>YOLOv4-tiny</span>的同学请前往《<span>YOLOv4-tiny</span>目标检测实战:训练自己的数据集》 <span></span> </p> <p> <span> </span> </p> <p> <span style="color:#E53333;">YOLOv4-tiny</span><span style="color:#E53333;">来了!速度大幅提升!</span><span></span> </p> <p> <span> </span> </p> <p> <span>YOLOv4-tiny</span>在<span>COCO</span>上的性能可达到:<span>40.2% AP50, 371 FPS (GTX 1080 Ti)</span>。相较于<span>YOLOv3-tiny</span>,<span>AP</span>和<span>FPS</span>的性能有巨大提升。并且,<span>YOLOv4-tiny</span>的权重文件只有<span>23MB</span>,适合在移动端嵌入式设备边缘计算设备上部署。<span></span> </p> <p> <span> </span> </p> <p> 本课程将手把手地教大家使用<span>labelImg</span>标注和使用<span>YOLOv4-tiny</span>训练自己的数据集。课程实战分为两个项目:单目标检测(足球目标检测)和多目标检测(足球和梅西同时检测)。<span></span> </p> <p> <span> </span> </p> <p> 本课程的<span>YOLOv4-tiny</span>使用<span>AlexAB/darknet</span>,在<span>Windows10</span>系统上做项目演示。包括:<span>YOLOv4-tiny</span>的网络结构安装<span>YOLOv4-tiny</span>标注自己的数据集整理自己的数据集修改配置文件训练自己的数据集测试训练出的网络模型性能统计<span>(mAP</span>计算<span>)</span>和先验框聚类分析。 <span> </span> </p> <p> <span> </span> </p> <p> 除本课程《<span>Windows</span>版<span>YOLOv4-tiny</span>目标检测实战:训练自己的数据集》外,本人推出了有关<span>YOLOv4</span>目标检测的系列课程。请持续关注该系列的其它视频课程,包括:<span></span> </p> <p> 《<span>Windows</span>版<span>YOLOv4</span>目标检测实战:训练自己的数据集》<span></span> </p> <p> 《<span>Windows</span>版<span>YOLOv4</span>目标检测实战:人脸口罩佩戴识别》<span></span> </p> <p> 《<span>Windows</span>版<span>YOLOv4</span>目标检测实战:中国交通标志识别》<span></span> </p> <p> 《<span>Windows</span>版<span>YOLOv4</span>目标检测:原理源码解析》<span></span> </p> <p> <span> <img alt="" src="https://img-bss.csdnimg.cn/202007061503586145.jpg" /></span> </p> <p> <span><img alt="" src="https://img-bss.csdnimg.cn/202007061504169339.jpg" /><br /> </span> </p>
©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页