zoukankan      html  css  js  c++  java
  • Gson解析复杂Json数据

    背景                                                                  

    json是一种数据格式,便于数据传输、存储、交换。

    gson是一种组件库,可以把java对象数据转换成json数据格式。

    推荐一个Json判别对错的网站:http://jsonlint.com/

    因为我在写程序的时候碰到了我自己写的json有错,然后我还不以为然,知道一直报错死活不成功才去网上搜网站查json的正确格式。

    我写的是android的程序,用到的是Gson包,开头用的1.6的包,老是报错,换成最新的2.2.4就没有错了。

    最新下载地址:https://code.google.com/p/google-gson/downloads/list

    代码                                                                   

    我要解析的Json数据为:

    private String jsonData = "[{"name":"Michael","age":20,"address":{"Long_name":"4long","short_name":"4short"}},{"name":"Mike","age":21,"address":{"Long_name":"1long","short_name":"1short"}}]";

    即:

    [
        {
            "name": "Michael",
            "age": 20,
            "address": {
                "Long_name": "4long",
                "short_name": "4short"
            }
        },
        {
            "name": "Mike",
            "age": 21,
            "address": {
                "Long_name": "1long",
                "short_name": "1short"
            }
        }
    ]

    array.java

    package com.yuyidong.json;
    
    import java.io.StringReader;
    
    import android.util.JsonReader;
    
    public class array {
    
        public array() {
            // TODO 自动生成的构造函数存根
        }
        
        public void parseJson(String jsonData)
        {
            JsonReader reader = new JsonReader(new StringReader(jsonData));
            try 
            {
                reader.beginArray();
                while(reader.hasNext())
                {
                    reader.beginObject();
                    //Session session = new Session();
                    while(reader.hasNext())
                    {
                        String tagName = reader.nextName();
                        if(tagName.equals("name"))
                        {
                            System.out.println("name--->" + reader.nextString());
                        }
                        else if(tagName.equals("age"))
                        {
                            System.out.println("age--->" + reader.nextInt());
                        }
                        else if(tagName.equals("address"))
                        {
                            reader.beginObject();
                            while(reader.hasNext())
                            {
                                String tagName2 = reader.nextName();
                                if (tagName2.equals("Long_name"))
                                {
                                    System.out.println("long_name--->" + reader.nextString());
                                }
                                else if (tagName2.equals("short_name"))
                                {
                                    System.out.println("short_name--->" + reader.nextString());
                                }
                            }
                            reader.endObject();
                        }
                    }
                    reader.endObject();
                }
                
                reader.endArray();
            } 
            catch (Exception e) 
            {
                // TODO 自动生成的 catch 块
                e.printStackTrace();
                System.out.println("BAD");
            }
            finally
            {
                try {
                    reader.close();
                } catch (Exception e) {
                    // TODO 自动生成的 catch 块
                    e.printStackTrace();
                }
            }
        }
        
    
    }
    在主文件调用,建立一个Button的监听器,在监听器中完成。
    array array_json = new array();
    array_json.parseJson(jsonData);
    image
    成功了。
     

    问题

    我尝试了一下另外的方法,没有成功,大神们帮我看看呀。也是同样的Json。
    address.java
    package com.yuyidong.json;
    
    
    public class address {
        private String Long_name;
        private String short_name;
    
        public String getlong_name()
        {
            return Long_name;
        }
        public void setlong_name(String Long_name)
        {
            this.Long_name = Long_name;
        }
        
        public String getshort_name()
        {
            return short_name;
        }
        public void setshort_name(String short_name)
        {
            this.short_name = short_name;
        }
    
        @Override
        public String toString() {
            // TODO 自动生成的方法存根
            return "Long_name--->"+getlong_name()+"
    short_name--->"+getshort_name();
        }
        
        
        
    }
    JsonUtils.java
    package com.yuyidong.json;
    
    import java.util.List;
    
    
    public class JsonUtils {
    
        private String name;
        private int age;
        private List<address> address;
    
        public String getname() {
            return name;
        }
    
        public void setname(String name) {
            this.name = name;
        }
        
        public int getAge() {
            return age;
        }
    
        public void setAge(int age) {
            this.age = age;
        }
    
        public List<address> getaddress() {
            return address;
        }
    
        public void setaddress(List<address> address) {
            this.address = address;
        }
    
        @Override
        public String toString() {
            // TODO 自动生成的方法存根
            return "name--->"+getname()+"
     age--->"+getAge()+"
     address--->"+getaddress();
        }
    }
    在主文件调用,建立一个Button的监听器,在监听器中完成。
    //Type type = new TypeToken<List<JsonUtils>>(){}.getType();  
    //Gson gson = new Gson();
    //List<JsonUtils> jsonutils = gson.fromJson(jsonData, type);
    //System.out.println(jsonutils.toString());
    Gson gson = new Gson();
    JsonUtils jsonUtils = gson.fromJson(jsonData, JsonUtils.class);
    System.out.println(jsonUtils);
    尝试了两种调用,但是都报错了。

    
    
    我附上源代码,求大神赐教。
    http://pan.baidu.com/s/1o65BB6a
    小弟在此谢过了。
     
     
     
    转载请注明出处:http://www.cnblogs.com/yydcdut/p/3688217.html
     
  • 相关阅读:
    开发环境搭建
    添加约束设置方式
    ubuntu和windows双系统启动顺序的修改
    函数指针,指针函数,数组指针,指针数组 区分
    boost
    centos7 64位如何配置网络
    MySQL数据库(主键、索引、外键、触发器...)
    几种常见字符集与字符编码
    ODBC、OLEDB应用详解
    C#事件以及EventHandler、EventArgs
  • 原文地址:https://www.cnblogs.com/yydcdut/p/3688217.html
Copyright © 2011-2022 走看看