json解析
来源:互联网 发布:软件架构师培训 编辑:程序博客网 时间:2024/05/21 17:49
json解析
常见的json解析
gson:谷歌推荐
fastjson:阿里巴巴开发
loganSquare:底层使用jackson
jackson:通用的java json库
Gson用法
String json1 = mGson.toJson(mTestEntityList); Type type = new TypeToken<List<TestEntity>>(){}.getType(); List<TestEntity> mList = mGson.fromJson(json1,type);
fastjson用法
String json2 = JSON.toJSONString(mTestEntityList); Log.i(TAG,"fastjson序列化:"+json3); Type type = new TypeToken<List<TestEntity>>(){}.getType(); List<TestEntity> mList02 = JSON.parseArray(json2,TestEntity.class); List<TestEntity> mList03 = JSON.parseObject(json2,type1); //mList02和mList03结果是一样的 Log.i(TAG,"fastjson反序列化:"+mList02.toString());
loganSquare用法
json1= LoganSquare.serialize(mTestEntityList);
Gson源码解析
1、官方提供了两种方式新建Gson对象,通过构造器和通过Builder
1、构造器方式 Gson gson = new Gson(); 2、builder模式 Gson gson = new GsonBuilder() .registerTypeAdapter(Id.class, new IdTypeAdapter()) .enableComplexMapKeySerialization() .serializeNulls() .setDateFormat(DateFormat.LONG) .setFieldNamingPolicy(FieldNamingPolicy.UPPER_CAMEL_CASE) .setPrettyPrinting() .setVersion(1.0) .create();
builder模式中可以添加很多自定义设置。、
2、Gson的主要方法有toJson()(序列化)、fromJson()(反序列化),通过重载方法,有一系列的方法。toJson(Object src)会调用如下代码:
public String toJson(Object src, Type typeOfSrc) {StringWriter writer = new StringWriter();toJson(src, typeOfSrc, writer);return writer.toString();}
注意这里的返回值就是最终的序列化字符串。其中StringWriter是一个字符串输出流。进一步追踪代码,如下所示:
public void toJson(Object src, Type typeOfSrc, Appendable writer) throws JsonIOException {try { JsonWriter jsonWriter = newJsonWriter(Streams.writerForAppendable(writer)); toJson(src, typeOfSrc, jsonWriter);} catch (IOException e) { throw new JsonIOException(e);}}
注意此处newJsonWriter()并不是笔误,而是Gson类中确实存在这样一个方法,用来将StringWriter传入构造器返回一个JsonWriter实例。然后进入如下代码:
public void toJson(Object src, Type typeOfSrc, JsonWriter writer) throws JsonIOException {TypeAdapter<?> adapter = getAdapter(TypeToken.get(typeOfSrc));//根据TypeToken,使用工厂类生成具体的TypeAdapterboolean oldLenient = writer.isLenient();writer.setLenient(true);boolean oldHtmlSafe = writer.isHtmlSafe();writer.setHtmlSafe(htmlSafe);boolean oldSerializeNulls = writer.getSerializeNulls();writer.setSerializeNulls(serializeNulls);try { ((TypeAdapter<Object>) adapter).write(writer, src);} catch (IOException e) { throw new JsonIOException(e);} finally { writer.setLenient(oldLenient); writer.setHtmlSafe(oldHtmlSafe); writer.setSerializeNulls(oldSerializeNulls);}}
getAdapter()中核心代码如下:
public <T> TypeAdapter<T> getAdapter(TypeToken<T> type) {...try { for (TypeAdapterFactory factory : factories) { TypeAdapter<T> candidate = factory.create(this, type); if (candidate != null) { call.setDelegate(candidate); typeTokenCache.put(type, candidate); return candidate; } }...} ...}
factories本质上是一个ArrayList<>,在Gson类中有如下代码:
factories.add(TypeAdapters.STRING_FACTORY);factories.add(TypeAdapters.INTEGER_FACTORY);factories.add(TypeAdapters.BOOLEAN_FACTORY);factories.add(TypeAdapters.BYTE_FACTORY);factories.add(TypeAdapters.SHORT_FACTORY);
说明TypeAdapters类中是TypeAdapter接口的具体实现。
所以((TypeAdapter) adapter).write(writer, src);最终会调用TypeAdapters中的类,以如下为例:
public static final TypeAdapter<Class> CLASS = new TypeAdapter<Class>() {@Overridepublic void write(JsonWriter out, Class value) throws IOException { if (value == null) { out.nullValue(); } else { throw new UnsupportedOperationException("Attempted to serialize java.lang.Class: " + value.getName() + ". Forgot to register a type adapter?"); }}@Overridepublic Class read(JsonReader in) throws IOException { if (in.peek() == JsonToken.NULL) { in.nextNull(); return null; } else { throw new UnsupportedOperationException( "Attempted to deserialize a java.lang.Class. Forgot to register a type adapter?"); }}};
最终会进入到JsonWriter,调用nullValue(),将数据写入到StringWriter中,最终return writer.toString()返回一个字符串就是序列化后的字符串。
fromJson的流程类似,只是是使用StringReader+JsonReader的组合,将数据写入到对象中,并且可以使用自定义的TypeToken。
fastJson解析
JSON类本身是一个抽象类,并且跟gson一个比较大的区别在序列化方法toJSONString使用了重载,而反序列化方法则分了几种,方法名有parse(),parseObject(),parseArray()。并且这一系列方法都加上了static修饰符,也就是说这些方法都是类方法。
1、序列化
首先新建一个SerializeWriter(继承自Writer)对象,然后使用JSONSerializer serializer = new JSONSerializer(out, config),将SerializeWriter传递到serializer,再调用write()方法,在该方法中通过类的类型在SerializeConfig工厂类中查找对应的ObjectSerializer类的实现类,然后调用实现类的write方法来实现具体的字符串组装,这部分的实现跟gson序列化的实现是类似的。
2、反序列化
fastJson的反序列化并没有使用io操作,而是直接对对象按照类的格式进行组装。像序列化一样有一个ParserConfig工厂类,使用一个自定义的IdentityHashMap
loganSquare
LoganSquare中保存了一个ConcurrentHashMap,类似于工厂索引。主要是对jackson进行了改造,使其能够更加的适应android平台。
未完待续。
总结
大部分的json框架都是利用Writer和Reader字符操作流,进行io操作,只是使用的具体实现类不同,比如Gson使用的是StringWriter和StringReader,而fastjson则使用的自定义的继承自Writer SerializeWriter以及直接组装的方式,loganSquare则是覆盖了jackson,序列化和反序列化都使用了io操作。
- 【JSON解析】JSON解析
- 解析JSON
- Json解析
- JSON解析
- JSON解析
- json解析
- Json解析
- Json解析
- JSON解析
- Json解析
- Json解析
- JSON解析
- JSON解析
- json 解析
- Json解析
- JSON解析
- json解析
- json 解析
- synchronized关键字实现同步
- Microsoft Office 批量授权版下载链接
- 【简记】Computer Networking——Data link layer
- Centos7修改默认启动级别(命令行,图形切换)
- java中dead code
- json解析
- GNU screen 设置滚屏
- leetcode-java.T016_threeSumClosest---给定包含n个整数数组S,找到S中的三个整数,从而使之和最接近给定的数,返回三个整数的总和.
- ASCII、Unicode和UTF-8编码的区别
- Hexo+Github搭建个人博客(小白版图文教程)
- Java+Selenium3.0基础篇3-如何启动谷歌浏览器
- 富不过三代已成过去,解答为什么越有钱的越有钱?
- u3d DoTween子物体回到原位
- 图片加载框架