`
san_yun
  • 浏览: 2638669 次
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

json协议实现

    博客分类:
  • json
 
阅读更多

网络传输数据需要定义一种数据格式,比较一下各种协议的性能:

序列化时间 反序列化时间 大小 压缩后大小
java序列化 8654 43787 889 541
hessian 6725 10460 501 313
protobuf 2964 1745 239 149
thrift 3177 1949 349 197
avro 3520 1948 221 133
json-lib 45788 149741 485 263
jackson 3052 4161 503 271
fastjson 2595 1472 468 251

测试数据:https://github.com/eishay/jvm-serializers/wiki/TestValue

 

这是一个468bytes的JSON Bytes测试,从测试结果来看,无论序列化和反序列化,json的性能已经不是瓶颈。今天重点关注了jackson的实现。

 

 

 

jackson对json的实现主要可以分为2部分parser和deserialize ,分别通过JsonParser和JsonDeserializer实现。

 

1.JsonParser

ReaderBasedParser是JsonParser的最终实现,继承关系如下:

public abstract class JsonParser {

}

public abstract class JsonParserMinimalBase extends JsonParser{

}

public abstract class JsonParserBase extends JsonParserMinimalBase{

}

public final class ReaderBasedParser extends JsonParserBase{

}
 

 

JsonParser 定义了基本的读取API。可以通过JsonFactory 来创建 JsonParser,其实parser就是做词法分析,实际上就是把输入的json字符串转换成char[],每次一个字符的读取,JsonToken是一个enum,定义了json中有用的token type:

 

public enum JsonToken{
    START_OBJECT("{"),
        
    /**
     * START_OBJECT is returned when encountering '}'
     * which signals ending of an Object value
     */
    END_OBJECT("}"),
        
    /**
     * START_OBJECT is returned when encountering '['
     * which signals starting of an Array value
     */
    START_ARRAY("["),
   /**
     * START_OBJECT is returned when encountering ']'
     * which signals ending of an Array value
     */
    END_ARRAY("]"),

}
 

 

 

2. JsonDeserializer

 

JsonDeserializer其实是string---->各种java类型的发序列化实现,jackson根据ava类型定义了不同的Deserializer,比如UntypedObjectDeserializer,CollectionDeserializer,ObjectArrayDeserializer,StringCollectionDeserializer,PrimitiveOrWrapperDeserializer

 

 

 

 

3.jackson一些小技巧

 

允许单引号:

String json = "{'photoId': '1012309', 'id': '1001'}";
JsonFactory factory = new JsonFactory();
ObjectMapper objectMapper = new ObjectMapper(factory);
objectMapper.configure(JsonParser.Feature.ALLOW_SINGLE_QUOTES, true);
JsonParser jsonParser = factory.createJsonParser(json);

nul对象转换成空字符:

package com.duitang.dboss.resolve.json;

import java.io.IOException;

import org.codehaus.jackson.JsonGenerator;
import org.codehaus.jackson.JsonProcessingException;
import org.codehaus.jackson.map.JsonSerializer;
import org.codehaus.jackson.map.SerializerProvider;

public class NullStringSerializer extends JsonSerializer<Object> {

    public final static NullStringSerializer instance = new NullStringSerializer();

    private NullStringSerializer(){
        super();
    }

    @Override
    public void serialize(Object value, JsonGenerator jgen, SerializerProvider provider) throws IOException,
                                                                                        JsonProcessingException {
        jgen.writeString("");

    }

}
 
StdSerializerProvider sp = new StdSerializerProvider();
sp.setNullValueSerializer(NullStringSerializer.instance);
objectMapper = new ObjectMapper(jsonFactory);
objectMapper.setSerializerProvider(sp);
 

 

分享到:
评论

相关推荐

    STM32上json协议解析代码

    在本项目中,STM32被用于实现与上位机的通信,通过JSON协议来接收和执行控制命令,具体涉及以下几个关键知识点: 1. **STM32硬件接口**:STM32通常配备有多个通用串行接口(USART),如USART1、USART2等,用于实现...

    MQL语言实现JSON协议库中文版注释

    MQL语言实现JSON协议库中文版注释

    Json数据格式协议C#解析方法

    ### Json数据格式协议C#解析方法 #### 一、Json介绍 JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,它源自于ECMAScript的一个子集,旨在提供一种简单且高效的方式来处理数据。JSON的数据格式是...

    OCPP json 国际充电开发协议

    在实施过程中,开发者需要区分OCPP-S(基于SOAP的实现)和OCPP-J(JSON的实现),并使用不同的后缀(-S或-J)来区分这两种协议。这是为了在通信时避免对实现类型的误解。 OCPP JSON 1.6协议的主要内容包括: 1. ...

    APIJSON是一种为API而生的JSON网络传输协议以及基于这套协议实现的ORM库

    4. 自动校验:APIJSON协议允许定义字段的校验规则,如类型、长度、范围等,可以自动进行数据验证,确保输入的合法性和安全性。 5. 动态SQL:APIJSON的ORM库支持动态SQL,可以根据请求参数自动生成合适的SQL语句,...

    基于python实现的http+json协议接口自动化测试框架源码改进版

    基于python实现的http+json协议接口自动化测试框架源码改进版,支持自动化

    基于php扩展swoole封装的一个简易的JSON协议的RPC框架

    本项目则是在Swoole的基础上,构建了一个基于JSON协议的远程过程调用(RPC)框架。通过此框架,开发者可以轻松地实现服务间的通信,提高系统的可扩展性和解耦性。 【描述】 这个简易的JSON-RPC框架是作者自己的实践...

    C++ 实现json形式的Socket传输图片

    本文将深入探讨如何使用C++实现基于JSON格式的Socket传输图片。首先,我们要了解涉及的知识点: 1. **C++**: C++是一种强大的、面向对象的编程语言,广泛用于系统软件、应用软件、游戏开发和高性能计算等领域。它的...

    Json协议下数据的序列化和反序列化的动态链接库和教程

    在本文中,我们将深入探讨JSON协议下的数据序列化和反序列化,以及如何利用动态链接库和教程来高效地操作JSON数据。 **一、JSON数据序列化** 数据序列化是指将数据结构或对象转换为可传输或存储的格式。在JSON中,...

    基于python实现的http+json协议接口自动化测试框架

    【标题】基于Python实现的HTTP+JSON协议接口自动化测试框架 在软件开发过程中,接口测试是确保系统间数据传输正确性和系统集成稳定性的重要环节。HTTP(超文本传输协议)是互联网上应用最为广泛的一种网络协议,而...

    一种基于JSON的智能家居协议栈设计.pdf

    4. 规范化设备和命令定义:通过严格定义设备和命令,协议栈能够规范应用层数据,实现对相同设备的统一操作。 在传输层的选择上,文档提到了TCP和UDP两种协议: 1. TCP协议主要适用于需要可靠数据传输的场景,其连接...

    用json实现的简单聊天修改版

    这个项目“用json实现的简单聊天修改版”显然是一个基于JSON的聊天应用程序,它可能是一个简单的命令行或文本界面,没有进行过多的图形用户界面(GUI)美化。 首先,我们要理解JSON的结构。JSON采用键值对的形式,...

    Android服务器解析json数据实现下拉刷新上拉加载ListView显示

    在Android开发中,实现一个能够从服务器获取JSON数据并展示在ListView中,同时支持下拉刷新和上拉加载的功能是一项常见的需求。这个"Android服务器解析json数据实现下拉刷新上拉加载ListView显示"的示例项目,就是...

    自己实现的Android PHP JSON实现登陆注册功能

    总结来说,这个项目展示了如何使用Android的OkHttp3库配合PHP后端和JSON数据交换,实现用户登录和注册功能。它涵盖了客户端的网络请求、数据序列化,以及服务器端的数据处理和响应。这个过程中的每个环节都是现代...

    C++实现的服务器post访问并实现JSON数据流解析

    总之,通过C++实现服务器POST访问并解析JSON数据流,需要对HTTP协议、JSON格式以及网络编程有深入理解。在具体实现过程中,选择合适的库可以大大提高开发效率和代码质量。在给定的项目中,`Httppost`文件很可能是...

    cJSON.rar_cjson_json c++ 简单_json 协议_json数据传输

    标题中的“cJSON”是一个C语言实现的JSON库,用于在C/C++程序中处理JSON数据。CJSON库提供了解析JSON字符串到C结构体和将C结构体转换回JSON字符串的功能。它具有轻量级、高效和易于集成的特点,适合嵌入式系统和资源...

    APIJSON网络传输协议是一种专为API而生的JSON网络传输协议,以及基于这套协议实现的ORM库.rar

    APIJSON 是一种专为 API 而生的 JSON 网络传输协议 以及 基于这套协议实现的 ORM 库。为 简单的增删改查、复杂的查询、简单的事务操作 提供了完全自动化的万能 API。” 上面这段话来自官方介绍,我们提取出其中的几...

    json-rpc协议C语言版

    在本文中,我们将深入探讨JSON-RPC协议的C语言实现,并对比其与Python的实现方式。 ### JSON-RPC简介 JSON-RPC允许客户端通过HTTP或其他传输协议向服务器发送请求,执行服务器上的方法并接收响应。它支持单个请求/...

    APIJSON 是一种专为 API 而生的 JSON 网络传输协议 以及 基于这套协议实现的 ORM 库

    APIJSON 是一种专为 API 而生的 JSON 网络传输协议 以及 基于这套协议实现的 ORM 库。 为各种增删改查提供了完全自动化的万能通用接口,零代码实时满足千变万化的各种新增和变更需求。能大幅降低开发和沟通成本,...

    android-json-rpc

    总的来说,android-json-rpc是Android开发中的一个强大工具,它极大地简化了JSON-RPC通信的实现,使开发者能更专注于业务逻辑,而不是底层通信细节。通过合理使用这个库,可以构建高效、可靠的Android应用。

Global site tag (gtag.js) - Google Analytics