fastxml Jackson

本文详细介绍了fastxml Jackson库,包括其概述、DataBinding处理json、Tree Model操作和Stream处理方式。重点讨论了LocalDateTime的序列化反序列化格式问题及其解决方案,提供了相关学习资源。
摘要由CSDN通过智能技术生成

一、   fastXml Jackson

1.      概述

a)      简介:是一个基于java平台的数据处理工具,json解析器。可以将java对象序列化为json格式的字符串,也可以将json反序列化为java对象。

b)     处理方法

            i.    Streaming API:高效(开销低,速度快,但是程序编写复杂)

            i.   Tree Model:灵活

           iii.  Data Binding:是最常用的处理方式

2.      DataBinding 处理json

c)      Java对象序列化为json

            i. new ObjectMapper().writeValue()相关方法

d)     Json字符串反序列化为java对象

           i.  new ObjectMapper().readValue() 相关方法

3.      Tree Model 处理json

e)      生成json

            i. 创建相关节点,如objectNode、arrayNode,节点之间可以相互嵌套添加(形成父子兄弟节点关系)。

//创建节点工厂用于创建相关节点

JsonNodeFactory factory = new JsonNodeFactory(false);

ObjectNode country = factory.objectNode();

/*对节点的操作*/

//对节点设置值,ObjectNode类型节点用put方法,ArrayNode类型节点用add方法

country.put(key,value);

array.add(value).add(value);

//节点之间的关联 set方法

country.set(key,array);

 

        ii. 创建json生产器

//创建一个json factory来写tree modle为json 

 JsonFactory jsonFactory = new JsonFactory(); 

 //创建一个json生成器,指定json生成的位置

JsonGenerator generator = jsonFactory.createGenerator(new FileWriter(new File(“country2.json”))); 

         iii. 生成json

ObjectMapper mapper=new ObjectMapper();

//根据根节点country 和generator生成器生成json

Mapper.writeTree(generator,country)

 

f)   Json字符串反序列化为treemode:读取解析json

         i.  读取json文件,生成JsonNode的树模型

ObjectMapper mapper = new ObjectMapper(); 

// Jackson提供一个树节点被称为”JsonNode”,ObjectMapper提供方法来读json作为树的JsonNode根节点 

JsonNode node = mapper.readTree(new File(“country2.json”)); 

 

       ii.  解析json文件(解析JsonNode)

//获得所有子节点的名字,返回一个所有节点名字的迭代器

Iterator<String> nodesName= node.fieldNames();

//根据节点名字获得节点

JsonNode anode=node.get(key); //get方法当key存在时返回null

JsonNode anode=node.path(key); //path方法当key不存在时返回MISSING 类型的JsonNode

//获得节点的值

String value=anode.asInt();

String value=anode.asTest();

4.      Stream处理json

g)      生成json

         i. 创建JsonGenerator生成器

JsonFactory factory = new JsonFactory(); 

//从JsonFactory创建一个JsonGenerator生成器的实例 ,并制定json文件

JsonGenerator generator = factory.createGenerator(new FileWriter(new File(“country3.json”)));

 

           ii.   利用JsonGenerator对象的相关方法生成json内容

h)     解析处理json

            i.    生成json的解析器

JsonFactory factory = new JsonFactory(); 

// 从JsonFactory创建JsonParser解析器的实例 

JsonParser parser = factory.createParser(new File(“country3.json”)); 

 

              ii.  利用解析器的相关方法解析json

5.      LocalDataTime序列化反序列化格式问题

a)      问题:

a)      默认序列化的格式很不友好,可读性很低

b)     反序列化报错失败(com.fasterxml.jackson.databind.JsonMappingException: Can notconstruct instance of java.time.LocalDateTime)

b)     解决

a)      继承StdSerializer类重写serialize方法指定序列化格式

packagecom.deserialize;

import
com.fasterxml.jackson.core.JsonGenerator;
import
com.fasterxml.jackson.databind.SerializerProvider;
import
com.fasterxml.jackson.databind.ser.std.StdSerializer;

import
java.io.IOException;
import
java.time.LocalDateTime;
import
java.time.format.DateTimeFormatter;

/**
 *
指定LocalDataTime序列化的格式
 * @author xujieni
 * @create 2017- 11 - 22 - 16:25
 */
public class LocalDataTimeSerializeextends StdSerializer<LocalDateTime> {
   
public LocalDataTimeSerialize(){super(LocalDateTime.class);}

   
@Override
   
public void serialize(LocalDateTime value,JsonGenerator gen,SerializerProvider provider) throwsIOException {
        String formatted = DateTimeFormatter.ofPattern(
"yyyy-MM-dd HH:mm").format(value);
       
gen.writeString(formatted);
   
}
}

 

 

a)      继承JsonDeserializer类重写deserialize方法指定反序列化的格式

package com.deserialize;
  
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;
  
import java.io.IOException;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
  
  /**
 * 指定反序列化的格式
 * @author user
 * @create 2017- 11 - 22 - 16:47
 */
  public class LocalDataTimeDeserialize extends JsonDeserializer<LocalDateTime> {
    @Override
    public LocalDateTime deserialize(JsonParser p, DeserializationContext ctxt) throws IOException, JsonProcessingException {
        String dateTimeString = p.getValueAsString();
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");
        //return LocalDateTime.from(LocalDateTime.parse(dateTimeString, formatter));
        return LocalDateTime.parse(dateTimeString,formatter);
  
    }
}

 

 

b)     继承ObjectMapper方法创建自己的ObjectMapper类,添加LocalDateTime的序列化和反序列化

package com.mapper;
  
import com.deserialize.LocalDataTimeDeserialize;
import com.deserialize.LocalDataTimeSerialize;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.module.SimpleModule;
  
import javax.security.auth.spi.LoginModule;
import java.time.LocalDateTime;
  
  /**
 * @author user
 * @create 2017- 11 - 22 - 16:24
 */
  public class LocalDataTimeObjectMapper extends ObjectMapper {
    public LocalDataTimeObjectMapper() {
        this.registerModule(new LocalDateTimeModule());
    }
  
    class LocalDateTimeModule extends SimpleModule{
        public LocalDateTimeModule(){
            addSerializer(LocalDateTime.class,new LocalDataTimeSerialize());
            addDeserializer(LocalDateTime.class,new LocalDataTimeDeserialize());
        }
    }
  
}

 

 

6.      学习资料:http://blog.csdn.net/xiong9999/article/details/53781695

FastXML发布1.11版 增加选择功能,修正1.1版一个无意义Property! ''' <summary> ''' 按元素名称选择元素 ''' </summary> ''' <param name="Key">关键词</param> ''' <param name="Method">选择方式</param> ReadOnly Property SelectElement(ByVal Key As String, ByVal Method As FastXML.Method) As XMLNodeList ''' <summary> ''' 按元素包含元素的值选择元素 ''' </summary> ''' <param name="Name">元素名称</param> ''' <param name="Values">元素值</param> ReadOnly Property SelectElementInElement(ByVal Name As String, ByVal Values As String) As XMLNodeList <summary> 按元素包含标记选择元素 </summary> <param name="Key">关键词</param> <param name="Method">选择方式</param> ReadOnly Property SelectElementInMark(ByVal Key As String, ByVal Method As FastXML.Method) As XMLNodeList <summary> 按元素包含标记值选择元素 </summary> <param name="Name">标记名称</param> <param name="Values">标记值</param> ReadOnly Property SelectElementInMark(ByVal Name As String, ByVal Values As String) As XMLNodeList 根据这些功能,有选择的选出元素,得到XMLNodeList类 这个类还可以再筛选元素! <summary> 筛选元素 </summary> <param name="Key">关键词</param> <param name="Method">选择方式</param> ReadOnly Property SelectElement(ByVal Key As String, ByVal Method As FastXML.Method) As XMLNodeList 筛选后又得出XMLNodeList ================================================================== 希望各位新手喜欢
FastXml是一个简单、高性能、极少内存消耗的基于xml pull机制的java xml解析器。性能最好的xml解析器:性能是VTD-XMl的3倍,是XPP3/MXP1的2倍,详见性能测试数据和测试代码 几乎不消耗额外的内存:内存消耗比XPP3/MXP1还要少很多 没有jar包依赖 jar包大小为18k,非常适合在移动互联网领域使用 FastXml的API与XMLPULL类似,但是要更简单一些,易于使用 支持namespace,但不校验schema 为什么FastXml这么快尽可能少的解码字节:往往xml文档中的很多字节都是ASCII范围,它们可以直接强转成char,而不需要解码,比如:标签名、属性名,大部分时候只需要对属性值和文本块进行解码即可。 注释、文档声明、DOCTYPE、无用的换行和空白通常不是我们关注的内容,所以这些内容自动被FastXml跳过了,使用API时更人性化。 当需要把某个属性值或者文本块内容转换为int、short、long时,不需要先把byte数组转化成string,然后再转化成int、short、long。FastXml直接把byte数组转换成对应的类型。 如果xml文档中有些标签内容你并不需要时,你可以跳过这些标签,你跳过的这部分将减少了字节解码,这在一些场景下能很好的帮助你提升性能。 FastXml类似XMLPULL一样,不校验文档schema和DTD,对文档的格式也不进行非常严格的校验:通常xml文档的格式都是正确的,当我们追求xml解析的最高性能时,就不需要对格式等内容进行及其严格的校验了。FastXml并不是完全没有校验,为了追求更好的性能,FastXml只是在解析过程中,对那些必须校验的地方进行校验。通常大部分的格式错误都能被校验出来。许可证Apache Licence, Version 2.0 标签:FastXml
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值