安卓-数据解析

Gson

Gson之@Expose注解

1
2
3
4
5
6
7
8
9
public class User{
@Expose
private String firstName;
@Expose(serialize = false)
private String lastName;
@Expose(serialize = false, deserialize = false)
private String emailAddress;
private String password;
}

如果使用new Gson()实例化一个对象的话,那么@Expose的注解是无效的,User中的参数都会参与序列化和反序列化。

如果使用的是

1
Gson gson = new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create()

Gson进行实例化,那么

  1. 没有被@Expose注解的password不会参与序列化与反序列化。
  2. lastName不会参与序列化。
  3. emailAddress不会参与序列化与反序列化

Xml

对xml有三种解析方式

  • DOM解析

    先把文档都读取到内存中,然后通过DOM API来访问树结构并获取数据,但是如果XML数据非常大,在处理效率上就会大打折扣了,这是相对于其他处理XML方式而言的。

  • SAX解析(Simple API for XML)

    • 相比于DOM方式,SAX是一种速度更快,更有效的方法。它逐行扫描文档,一边扫描一边解析,缺点是操作复杂。
    • SAX是基于事件驱动的。当然Android的事件机制是基于回调函数的,在用SAX解析xml文档时候,在读取到文档开始和结束标签时就会回调一个事件,在读取到其他节点和内容时也会回调一个事件。

    SAX方式是按照一定的顺序进行解析数据的,其顺序主要按照以下的方法一次执行:

    • startDocument()

      当开始解析xml文件的声明的时候就会调用这个方法,可以做一些初始化的工作。

    • startElement()

      当开始解析元素的开始标签的时候,就会调用这个方法。

    • characters()

      当读到文本元素的时候要调用这个方法。

    • endElement()

      当读到结束标签的时候就会调用这个方法。

  • PULL解析

    • 在Android体系中,很多资料文件中,很多是xml格局,在android体系中解析这些xml的格式,是应用PULL解析器进行解析的,它和SAX解析一样,也是采取事务驱动进行解析的。

    • 由于PULL解析方式与SAX解析方式相似,都是采用事务驱动进行解析的,只不过PULL方式读xml回调方法返回的是数字。

      PULL解析中的事件为:

      • 开始文档 START_DOCUMENT
      • 结束文档 END_DOCUMENT
      • 开始元素 START_TAG
      • 结束元素 END_TAG

      遇到元素内容 TEXT 等需要调用 next() 方法提取它们

数据解析问题

Gson解析,字段比bean多或少。导致json字符串解析不出来内容的问题

此方法需要json数据和bean属性一一对应

1
2
JsonObject bsqJson = new JsonParser().parse(commonModel.getJsonData().toString()).getAsJsonObject();
BsqBaseInfoModel bsqModel = new Gson().fromJson(bsqJson, BsqBaseInfoModel.class);

此方法不需json数据和bean属性一一对应

1
List<BsqBaseInfoModel> result=new Gson().fromJson(commonModel.getJsonData().toString(), new TypeToken<List<BsqBaseInfoModel>>(){}.getType());

包:

1
2
3
4
import com.google.gson.Gson;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
import com.google.gson.reflect.TypeToken;

转json字符串出现"$ref"的问题

问题:对象转json字符串,断点取到json字符串中带"$ref"等字样,不是实际的值的问题。(有出现debug正常,release异常的情况)

解决:升级了fastjson版本导致的,使用Gson解析方式。

1
2
Gson gson = new Gson();
String idsStr = gson.toJson(submitBean);