解析json常用几种方式

1.使用Google 的 gson方式解析json,园子里面对json方面的教程都非常多,很多写的都非常不错,借鉴不少,毕竟刚刚研究.

gson支持解析的类型还是比较全面的,包括JavaBean,List<JavaBean>,List<String>,Map等,使用起来也是比较方便.

首先配置环境,需要下载相应的jar包, 下面测试使用的版本是2.2.4.

官方下载地址:http://code.google.com/p/google-gson/

gson API:http://google-gson.googlecode.com/svn/trunk/gson/docs/javadocs/index.html

测试用例(源码附件GsonJson.zip,下载地址:http://pan.baidu.com/s/1qWHNjdU):

public class MyGson {

    private Gson gson = new Gson(); 

    //java bean to json string
    @Test
    public void beanToJson(){
        Person person  = new Person();
        person.setId(1);
        person.setName("zhanglu");
        person.setAddress("湖北大悟");
        System.out.println(gson.toJson(person));
    }

    //json string to java bean
    @Test
    public void jsonTobean(){
        String json = "{‘id‘:‘1‘,‘name‘:‘zhang‘,‘address‘:‘Hubei‘}";
        Person person = gson.fromJson(json, Person.class);
        System.out.println(person);
    }

    //list<bean> to json
    @Test
    public void listBeanToJson(){
        Person person1 = new Person(1, "zhang", "Hubei");
        Person person2 = new Person(2,"lu","DaWu");
        List<Person> persons = new ArrayList<>();
        persons.add(person1);
        persons.add(person2);
        String json = gson.toJson(persons);
        System.out.println(json);
    }

    //json to list<bean>
    @Test
    public void jsonToListBean(){
        String json = "[{‘id‘:‘1‘,‘name‘:‘zhang‘,‘address‘:‘Hubei‘},{‘id‘:‘2‘,‘name‘:‘lu‘,‘address‘:‘DaWu‘}]";
        List<Person> persons = gson.fromJson(json, new TypeToken<List<Person>>(){}.getType());
        for(Person per : persons){
            System.out.println(per);
        }
    }

    //list string to string
    @Test
    public void listStringToJson(){
        List<String> list = new ArrayList<>();
        list.add("zhanglu");
        list.add("hubei");
        list.add("Dawu");
        String json = gson.toJson(list);
        System.out.println(json);
    }

    //json string to list<string>
    @Test
    public void jsonToListString(){
        String json = "[‘zhanglu‘,‘hubei‘,‘Dawu‘]";
        List<String> list = gson.fromJson(json, new TypeToken<List<String>>(){}.getType());
        for(String str : list){
            System.out.println(str);
        }
    }

    //Map<String,object> to json
    @Test
    public void mapToJson(){
        Map<String, Person> map = new HashMap<>();
        Person person = new Person(1, "zhanglu", "湖北大悟");
        Person person2 = new Person(2, "Alone", "HuBeiDaWu");
        map.put("person", person);
        map.put("person2", person2);
        String json = gson.toJson(map);
        System.out.println(json);
    }

    //json to Map<Stirng,Object>
    @Test
    public void jsonToMap(){
        String json = "{‘person‘:{‘id‘:1,‘name‘:‘zhanglu‘,‘address‘:‘湖北大悟‘},‘person2‘:{‘id‘:2,‘name‘:‘Alone‘,‘address‘:‘HuBeiDaWu‘}}";
        Map<String, Person> map = gson.fromJson(json, new TypeToken<Map<String,Person>>(){}.getType());
        for(String str : map.keySet()){
            System.out.println("key:"+str);
            System.out.println((Person)map.get(str));
        }
    }

    //test refrences obj
    //如果双向引用, 会产生死循环,  方法1, 在需要被过滤的字段上加上修饰符transient, Cat的animail加上了
    //方法1:排除transient字段
    /*//方法2:排除Modifier为指定类型的字段Gson gson = new GsonBuilder().excludeFieldsWithModifiers(Modifier.PROTECTED) // <---.create();*/
    //方法3:使用@Expose注解,注意,没有被 @Expose 标注的字段会被排除,如下所示:
    @Test
    public void testReferences(){
        Animail animail = new Animail();
        animail.setName("Animial");
        Cat cat = new Cat();
        cat.setId(1);
        cat.setName("Cat1");
        cat.setAnimail(animail);
        Cat cat2 = new Cat();
        cat2.setId(2);
        cat2.setName("Cat2");
        cat.setAnimail(animail);
        List<Cat> cats  = new ArrayList<>();
        cats.add(cat2);
        cats.add(cat);
        animail.setCatlist(cats);
        String json = gson.toJson(animail);
        System.out.println(json);
    }

    //方法4:使用ExclusionStrategy定制字段排除策略,这种方式最灵活,下面的例子把所有以下划线开头的字段全部都排除掉:
    @Test
    public void ExclusionStrategy(){
        ClassInfo classInfo = new ClassInfo();
        classInfo.setClassNo("C0001");
        classInfo.setClassName("Java_1");
        StudentInfo stu1 = new StudentInfo();
        stu1.setStuId(1);
        stu1.setStuName(1);
        StudentInfo stu2 = new StudentInfo();
        stu2.setStuId(1);
        stu2.setStuName(1);
        stu1.setClassInfo(classInfo);
        stu2.setClassInfo(classInfo);
        List<StudentInfo> stulist = new ArrayList<>();
        stulist.add(stu2);
        stulist.add(stu1);
        classInfo.setStudentslist(stulist);
        ExclusionStrategy myExclusionStrategy = new ExclusionStrategy() {
              @Override
              public boolean shouldSkipField(FieldAttributes fa) {
                  return fa.getName().equals("classInfo");
              }

              @Override
              public boolean shouldSkipClass(Class<?> clazz) {
                  return false;
              }
         };
        Gson gson = new GsonBuilder().setExclusionStrategies(myExclusionStrategy).create();
        String json = gson.toJson(classInfo);
        System.out.println(json);
    }
}

2.使用阿里的fastJson方式解析json,阿里官方介绍说这个比gson效率更高速度更快,使用fastJson的人也非常多,至少我有些同学公司里面在使用, 不乏游戏开发在使用,也有人说有Bug,具体我也没有对两者进行比较测试.

fastJson同样支持常用的数据类型解析,还提供了大文本解析和对时间类型的解析方式,同样也有android版本jar, 但是这个不是C#的FastJson, 首字母大小写是不一样的, 也不是同一个东西, 不可混为一谈.

官网文档::https://github.com/alibaba/fastjson/wiki/常见问题

笔者测试使用的版本是1.1.41,下载地址:http://repo1.maven.org/maven2/com/alibaba/fastjson/1.1.41/

fastJson其它版本官方下载地址:http://repo1.maven.org/maven2/com/alibaba/fastjson/

maven配置:

<dependency>
     <groupId>com.alibaba</groupId>
     <artifactId>fastjson</artifactId>
     <version>1.1.41</version>
</dependency>

测试用例(源码附件fastJson.zip,下载地址:http://pan.baidu.com/s/1pJE1xsZ):

public class FastJsonTest {

    // Java bean to json
    @Test
    public void JavaBeanToJson() {
        Person person = new Person(1, "zhanglu", "Hubei");
        String json = JSON.toJSONString(person);
        System.out.println(json);
    }

    // Json to Javabean
    @Test
    public void JsonToJavaBean() {
        String json = "{‘address‘:‘Hubei‘,‘id‘:1,‘name‘:‘zhanglu‘}";
        Person person = JSON.parseObject(json, Person.class);
        System.out.println(person);
    }

    // List<JavaBean> to json
    @Test
    public void listJavaBeanToJson() {
        Person p1 = new Person(1, "zhanglu", "Hubei");
        Person p2 = new Person(2, "wukang", "Hubei");
        List<Person> personlist = new ArrayList<>();
        personlist.add(p1);
        personlist.add(p2);
        String json = JSON.toJSONString(personlist);
        System.out.println(json);
    }

    // Json to List<JavaBean>
    @Test
    public void JsonToListBean() {
        String json = "[{‘address‘:‘Hubei‘,‘id‘:1,‘name‘:‘zhanglu‘},{‘address‘:‘Hubei‘,‘id‘:2,‘name‘:‘wukang‘}]";
        List<Person> persons = JSON.parseArray(json, Person.class);
        for (Person person : persons) {
            System.out.println(person);
        }
    }

    // List<String> to json
    @Test
    public void listStringToJson() {
        List<String> list = new ArrayList<>();
        list.add("zhanglu");
        list.add("wukang");
        String json = JSON.toJSONString(list);
        System.out.println(json);
    }

    // json to List<String>
    @Test
    public void JsonToListString() {
        String json = "[‘zhanglu‘,‘wukang‘]";
        List<String> list = JSON.parseArray(json, String.class);
        for (String str : list) {
            System.out.println(str);
        }
    }

    // Map<String,Object> to json
    @Test
    public void MapToJson() {
        Map<String, Person> map = new HashMap<>();
        map.put("person1", new Person(1, "zhanglu", "Hubei"));
        map.put("person2", new Person(2, "wukang", "Hubei"));
        String json = JSON.toJSONString(map);
        System.out.println(json);
    }

    // Json to Map<String,JavaBean>
    @Test
    public void JsonToMap() {
        String json = "{‘person1‘:{‘address‘:‘Hubei‘,‘id‘:1,‘name‘:‘zhanglu‘},‘person2‘:{‘address‘:‘Hubei‘,‘id‘:2,‘name‘:‘wukang‘}}";
        Map<String, Person> map = JSON.parseObject(json,
                new TypeReference<Map<String, Person>>() {
                });
        for (String key : map.keySet()) {
            System.out.println("key:" + key);
            System.out.println(map.get(key));
        }
    }

    // Test references javaBean
    // Animail,Cat
    @Test
    public void TestReferences() {
        Animail animail = new Animail();
        animail.setName("animial");
        Cat cat = new Cat();
        cat.setId(1);
        cat.setName("MiMi");
        Cat cat2 = new Cat();
        cat2.setId(1);
        cat2.setName("CiCi");
        cat.setAnimail(animail);
        cat2.setAnimail(animail);
        List<Cat> catlist = new ArrayList<>();
        catlist.add(cat2);
        catlist.add(cat);
        animail.setCatlist(catlist);
        String json = JSON.toJSONString(animail);
        System.out.println(json);
    }

    // Test references javaBean
    // Animail,Cat
    @Test
    public void TestReferences2() {
        Animail animail = new Animail();
        animail.setName("animial");
        Cat cat = new Cat();
        cat.setId(1);
        cat.setName("MiMi");
        Cat cat2 = new Cat();
        cat2.setId(1);
        cat2.setName("CiCi");
        cat.setAnimail(animail);
        cat2.setAnimail(animail);
        List<Cat> catlist = new ArrayList<>();
        catlist.add(cat2);
        catlist.add(cat);
        animail.setCatlist(catlist);
        String json = JSON.toJSONString(animail,SerializerFeature.DisableCircularReferenceDetect);
        System.out.println(json);
    }

    // methods 01 transient
    // @JSONField(serialize=false)

    // Date to Json
    @Test
    public void DateToJson(){
        StudentInfo studentInfo = new StudentInfo();
        studentInfo.setBirthday(new Date());
        studentInfo.setId(1);
        JSON.DEFFAULT_DATE_FORMAT = "yyyy-MM-dd";
        String json = JSON.toJSONString(studentInfo,SerializerFeature.WriteDateUseDateFormat);
        System.out.println(json);
    }
}
时间: 2024-08-08 13:45:08

解析json常用几种方式的相关文章

解析JSON的四种方式

1.现在的解析数据类型越来越多的是json数据,现在让我们来解析下json数据: 作为一种轻量级的数据交换格式,json正在逐步取代xml,成为网络数据的通用格式. 有的json代码格式比较混乱,可以使用此“http://www.bejson.com/”网站来进行JSON格式化校验(点击打开链接).此网站不仅可以检测Json代码中的错误,而且可以以视图形式显示json中的数据内容,很是方便. 从IOS5开始,APPLE提供了对json的原生支持(NSJSONSerialization),但是为了

解析JSON有俩种方式:JSONObject和GSON

JSONObject: //JSONObject解析JSON文件 private void parseJSONWithJSONObject(String json_data) { try { JSONArray jsonArray=new JSONArray(json_data); for(int i=0;i<jsonArray.length();i++) { JSONObject jsonObject=jsonArray.getJSONObject(i); String id=jsonObje

C#解析json的两种方式

C#中Json转换主要使用的几种方法! 这篇主要介绍2.4.第三种方法使用的比较局限,所以我没有深入学习. 第二种方法 我使用比较多的方式,这个方法是.NET内置的,使用起来比较方便 A.利用serializer获取json的泛型对象 利用Dictionary<string,object>接收转换完的json对象,然后用查询泛型的指令即可提取想要的json对象. string JsonData = “xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx”; JavaScriptSeri

解析XML的4种方式及优缺点比较

dom, sax是解析xml的底层接口 而jdom和dom4j则是基于底层api的更高级封装    dom是通用的,而jdom和dom4j则是面向java语言的 (方法一). DOM解析说明:为 XML 文档的已解析版本定义了一组接口.解析器读入整个文档,然后构建一个驻留内存的树结构,然后代码就可以使用 DOM 接口来操作这个树结构.优点:整个文档树在内存中,便于操作:支持删除.修改.重新排列等多种功能:缺点:将整个文档调入内存(包括无用的节点),浪费时间和空间:使用场合:一旦解析了文档还需多次

详解android解析Xml的三种方式——DOM、SAX以及XMLpull

今天学习了android解析Xml的三种方式——DOM.SAX以及XMLpull,这里对它们进行总结. 如果理解有误,欢迎指正   ^_* 一.DOM方式解析: xml是先把xml文档都读到内存中,然后再用DOM API来访问树形结构,并获取数据.这个写起来很简单,但是很消耗内存.要是数据过大,手机不够牛逼,可能手机直接死机. 常用的DoM接口和类: Document:该接口定义分析并创建DOM文档的一系列方法,它是文档树的根,是操作DOM的基础.Element:该接口继承Node接口,提供了获

MVC web api 返回JSON的几种方式,JSON时间去T的几种方式。

MVC web api 返回JSON的几种方式 1.在WebApiConfig的Register中加入以下代码 1 config.Formatters.JsonFormatter.SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/html")); 2.在WebApiConfig的Register中加入以下代码 1 config.Formatters.Remove(config.Formatters.XmlFormatter);

java解析xml文件四种方式介绍、性能比较和基本使用方法

一.介绍: 1)DOM(JAXP Crimson解析器) DOM是用与平台和语言无关的方式表示XML文档的官方W3C标准.DOM是以层次结构组织的节点或信息片断的集合.这个层次结构允许开发人员在树中寻找特定信息.分析该结构通常需要加载整个文档和构造层次结构,然后才能做任何工作.由于它是基于信息层次的,因而DOM被认为是基于树或基于对象的.DOM以及广义的基于树的处理具有几个优点.首先,由于树在内存中是持久的,因此可以修改它以便应用程序能对数据和结构作出更改.它还可以在任何时候在树中上下导航,而不

Mock服务端:客户端Get请求,返回json数据两种方式

Mock服务端:客户端Get请求,返回json数据两种方式:1,直接在response中返回json数据 2,通过json文件返回: 准备工作: wiremock-body-transformer-1.1.6.jar wiremock-standalone-2.14.0.jar 安装java运行环境(jdk等) 一,直接在response中返回: 说明: mappings : 对应请求request位置 __files : 对应响应reponse位置 mappings中增减文件:get.json

搭建pytorch神经网络的常用两种方式

'''本节说明搭建pytorch神经网络的常用两种方式 相比快速搭建法 第一种可以个性化设置网络结构''' import torch import torch.nn.functional as F #方式1 用 class 继承了一个 torch 中的神经网络结构, 然后对其进行了修改 class Net(torch.nn.Module): def __init__(self, n_feature, n_hidden, n_output): super(Net, self).__init__()