JSON

比Gson解析速度快10倍!——Json解析神器Jackson使用介绍(4)

字号+ 作者:H5之家 来源:H5之家 2017-03-03 11:01 我要评论( )

下面是解析简单的集合对象的代码 public void toObjects() throws Exception { Person p = new Person(zhaokaiqiang, 22, new Birthday(1992, 1, 19)); ArrayListPerson persons = new ArrayListPerson(); persons.

    下面是解析简单的集合对象的代码
    public void toObjects() throws Exception {  
      
            Person p = new Person("zhaokaiqiang", 22, new Birthday(1992, 1, 19));  
      
            ArrayList<Person> persons = new ArrayList<Person>();  
            persons.add(p);  
            persons.add(p);  
            persons.add(p);  
      
            ObjectMapper objectMapper = new ObjectMapper();  
            String jsonString = getJsonString(persons);  
            @SuppressWarnings("unchecked")  
            ArrayList<Person> arrayList = objectMapper.readValue(jsonString,  
                    new ArrayList<Person>().getClass());  
            Log.d(TAG, arrayList.toString());  
      
        } 

 

4.解析复杂的Json对象

    这里所说的复杂对象,与上面的生成的复杂Json对象是一个意思,指不是由简单的基本类型或者是单一对象集合的Json对象。我们要进行解析测试的文本,是下面的这种形式
    {"name":"zhaokaiqiang","age":22,"person":{"name":"zhaokaiqiang","birthday":{"day":19,"month":1,"year":1992},"age":22}} 

    这个字符串中有字符串类型、int类型、一个拥有对象属性的一个自定义的对象,所以使用上面的进行类型反射的做法是完不成解析操作的,因为这个对象比较复杂,所以经过研究,我决定采用分段的方式进行解析,也就是对于这种Object类型的Json数据,分别根据key取出value,然后单独对里面的自定义对象进行解析,下面我们看代码实现:
    public void fromJsons() throws Exception {  
      
        String jsonString = createObjectJson();  
        ObjectMapper objectMapper = JacksonMapper.getInstance();  
          
        JsonNode jsonNode = objectMapper.readTree(jsonString);  
        JsonNode nameNode = jsonNode.get("name");  
        JsonNode ageNode = jsonNode.get("age");  
        JsonNode persoNode = jsonNode.get("person");  
          
        String personString = persoNode.toString();  
        Person person = objectMapper.readValue(personString, Person.class);  
      
        Log.d(TAG, "person=" + person.toString());  
        Log.d(TAG, "age=" + ageNode.asInt());  
        Log.d(TAG, "name=" + nameNode.asText());  
      
    } 
  我们在这里使用了ObjectMapper的readTree方法,返回一个JsonNode对象,我们在这里采用的是树模型的解析方式,类似XML中的DOM。

    如果我们想获取基本数据类型的数据,那么我们使用JsonNode.get()根据key获取到包含了value的JsonNode对象之后,根据类型,使用as__()即可将需要获取的数据提取出来。JsonNode代表的是一个节点,是Json的树模型的一个基础类。

    但是如果想获取类型是非基础类型的数据的时候,JsonNode并没有提供对应的方法,所以我们只能使用JsonNode的toString方法,获取到Json格式的数据,然后根据我们前面介绍的解析简单对象的方法再次解析即可。但是有一个注意点,就是我们获取key为"person"的数据的时候,不能够使用JsonNode.asText()来获取,因为这并不是一个文本,而是一个Object形式的另外一个Json对象,这样做会获取不到的,所以我用的toString()获取。

    当然,这只是我自己探索出来的一个方法,还有其他的方案,比如直接创建这种类型的JavaBean,但是比较麻烦,上面的这种方法更加直观。

 

5.总结

    到现在为止,Android平台下主流的三种Json解析方式已经介绍完毕,我们来总结一下:

(1)Android自带的Json类库,效率低,使用繁琐,不支持反射解析,不推荐使用

(2)google的Gson解析库,这个是我之前一直使用的类库,使用方便,资料比较多,效率对于小量的数据解析来说没有问题,也是很推荐大家使用

(3)jackson是效率最高的解析方案,如果数据量巨大,这个方案绝对是首选。如果数据量比较小,和Gson相比差别不是很大,自己哪个顺手用那个。

 

    除了上面介绍的Jackson,Jackson还有其他更强大的用法,这里就不一一介绍了,用到再说,下面是几个参考网址:

(1)Jackson在线文档:?api=jackson-1.9.9

(2)Jackson介绍的官网翻译:

(3)Jackson源码查看:

(4)在线Json验证:

 

   文章中的测试Demo下载地址:https://github.com/ZhaoKaiQiang/JsonDemo


 


 


 


 

 


 



 


 


 


 

 

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

相关文章
  • [转载]STM32 ARM开发板神器,31个经典实例教程

    [转载]STM32 ARM开发板神器,31个经典实例教程

    2015-11-21 16:28

网友点评
>