zoukankan      html  css  js  c++  java
  • json数据格式+gson解析json问题总结

    一、使用gson解析json数据时,如果出现某一个属性为null的情况(且并无报错信息),首先检查json文件的属性名称和实体类的属性名称是否一致。

    举例如下(正常情况,此处读取本地的一个json文件):

    json文件

    {"name":"Tim",
    "age":"40",
    "job":"basketball",
    "hobby":"dai"}

    解析代码如下

    String jsonstring=FileUtil.readAssets(ctx,"tim.json");
    		Gson g=new Gson();
    		tim=g.fromJson(jsonstring, Tim.class);
    

    实体类如下

    package com.example.jsondemoerror;
    
    public class Tim {
    	private String name;
    	private String age;
    	private String job;
    	private String hobby;
    	public String getName() {
    		return name;
    	}
    	public void setName(String name) {
    		this.name = name;
    	}
    	public String getAge() {
    		return age;
    	}
    	public void setAge(String age) {
    		this.age = age;
    	}
    	public String getJob() {
    		return job;
    	}
    	public void setJob(String job) {
    		this.job = job;
    	}
    	public String getHobby() {
    		return hobby;
    	}
    	public void setHobby(String hobby) {
    		this.hobby = hobby;
    	}
    	@Override
    	public String toString() {
    		return "Tim [name=" + name + ", age=" + age + ", job=" + job
    				+ ", hobby=" + hobby + "]";
    	}
    	
    
    	
    }
    

    json文件的各属性名称和实体类的名称一致时,解析成功。

    若出现名称不一致:

    1、json文件的名称写错,实体类未错,比如hobby写为hobb,出现Tim [name=Tim, age=40, job=basketball, hobby=null]。

    2、实体类属性名称写错,json未错,比如把hobby写为hobb,出现Tim [name=Tim, age=40, job=basketball, hobb=null]。

    二、使用gson可以直接解析出实体类的集合。

    json文件

    {"name":"Tim",
    "age":"40",
    "job":"basketball",
    "hobby":
    [{"name":"sing","time":"1"},
    {"name":"dance","time":"1"},
    {"name":"swim","time":"1"},
    {"name":"dai","time":"1"}]}

    实体类如下

    package com.example.jsondemoerror;
    
    import java.util.List;
    
    public class Tims {
        private String name;
        private String age;
        private String job;
        private List<Hobby> hobby;
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public String getAge() {
            return age;
        }
        public void setAge(String age) {
            this.age = age;
        }
        public String getJob() {
            return job;
        }
        public void setJob(String job) {
            this.job = job;
        }
        public List<Hobby> getHobby() {
            return hobby;
        }
        public void setHobby(List<Hobby> hobby) {
            this.hobby = hobby;
        }
        @Override
        public String toString() {
            return "Tims [name=" + name + ", age=" + age + ", job=" + job
                    + ", hobby=" + hobby + "]";
        }
        
        
    
        
    }

    解析代码

    String jsonstring=FileUtil.readAssets(ctx,"tims.json");
            Gson g=new Gson();
            tims=g.fromJson(jsonstring, Tims.class);
            Log.d("JsonErrorActivity", tims.toString()+tims.getHobby().get(0).getName());

    log内容

    Tims [name=Tim, age=40, job=basketball, hobby=[Hobby [name=sing, time=1], Hobby [name=dance, time=1], Hobby [name=swim, time=1], Hobby [name=dai, time=1]]]sing

    三、使用gson可以解析出实体类。

    json文件

    {"name":"Tim",
    "age":"40",
    "job":"basketball",
    "hobby":
    {"name":"sing","time":"1"}
    }
    View Code

    实体类

    package com.example.jsondemoerror;
    
    public class Timsh {
        private String name;
        private String age;
        private String job;
        private Hobby hobby;
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public String getAge() {
            return age;
        }
        public void setAge(String age) {
            this.age = age;
        }
        public String getJob() {
            return job;
        }
        public void setJob(String job) {
            this.job = job;
        }
        public Hobby getHobby() {
            return hobby;
        }
        public void setHobby(Hobby hobby) {
            this.hobby = hobby;
        }
        @Override
        public String toString() {
            return "Timsh [name=" + name + ", age=" + age + ", job=" + job
                    + ", hobby=" + hobby + "]";
        }
        
        
    
        
    }
    View Code

    解析代码

    String jsonstring=FileUtil.readAssets(ctx,"timsh.json");
            Gson g=new Gson();
            timsh=g.fromJson(jsonstring, Timsh.class);
            Log.d("JsonErrorActivity", timsh.toString()+timsh.getHobby().getName());
    View Code

    log内容

    Timsh [name=Tim, age=40, job=basketball, hobby=Hobby [name=sing, time=1]]sing

    四、使用gson转对象为json时需注意为空的属性将不会进行转换,切勿理解为会转换为空值。

    实体类:

    package gson;
    
    public class Tim {
    
        private String name;
        private String age;
        private String job;
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public String getAge() {
            return age;
        }
    
        public void setAge(String age) {
            this.age = age;
        }
    
        public String getJob() {
            return job;
        }
    
        public void setJob(String job) {
            this.job = job;
        }
    
        @Override
        public String toString() {
            return "Tim [name=" + name + ", age=" + age + ", job=" + job + "]";
        }
    
    }
    View Code

    测试例子:

    package com.test.gson;
    
    import com.google.gson.Gson;
    
    public class Demo {
    
        public static void main(String[] args) {
            Tim tim = new Tim();
            tim.setAge("20");
            tim.setName("tim");
            tim.setJob(null);
            Gson gson = new Gson();
            System.out.println(gson.toJson(tim));
    
        }
    
    }

    console打印:

    {"name":"tim","age":"40"}

    因为未设置job属性,转换的json格式数据无此属性。

    五、gson转换json若想要体现属性为null或者未设置的属性为null,采用如下方式:

    package com.test.gson;
    
    import com.google.gson.Gson;
    import com.google.gson.GsonBuilder;
    
    public class Demo {
    
        public static void main(String[] args) {
            Tim tim = new Tim();
            tim.setAge("20");
            tim.setName("tim");
            tim.setJob(null);
            // Gson gson = new Gson();
            // System.out.println(gson.toJson(tim));
            Gson gson = new GsonBuilder().serializeNulls().create();
            System.out.println(gson.toJson(tim));
        }
    }

    结果:

    {"name":"tim","age":"20","job":null}

    六、json的数据格式:

    json的数据格式有:字符串、数字、布尔值、对象(包括空值null)、数组,举例如下:

    package com.test.gson;
    
    import java.util.ArrayList;
    import java.util.List;
    
    import com.google.gson.Gson;
    import com.google.gson.GsonBuilder;
    
    public class JsonDemo {
    
        public static void main(String[] args) {
            NormalJson normalJson = new JsonDemo().new NormalJson();
            normalJson.setPropertyString("hello world");
            normalJson.setPropertyInt(1);
            normalJson.setPropertyBoolean(true);
            normalJson.setPropertyObject(new Object());
            normalJson.setPropertyNull(null);
            List<String> list = new ArrayList<String>();
            list.add("a");
            list.add("b");
            normalJson.setPropertyArray(list);
            Gson gson = new GsonBuilder().serializeNulls().create();
            System.out.println(gson.toJson(normalJson));
        }
    
        public class NormalJson {
            private String propertyString;
            private int propertyInt;
            private boolean propertyBoolean;
            private Object propertyObject;
            private Object propertyNull;
            private List<String> propertyArray;
    
            public String getPropertyString() {
                return propertyString;
            }
    
            public void setPropertyString(String propertyString) {
                this.propertyString = propertyString;
            }
    
            public int getPropertyInt() {
                return propertyInt;
            }
    
            public void setPropertyInt(int propertyInt) {
                this.propertyInt = propertyInt;
            }
    
            public boolean isPropertyBoolean() {
                return propertyBoolean;
            }
    
            public void setPropertyBoolean(boolean propertyBoolean) {
                this.propertyBoolean = propertyBoolean;
            }
    
            public Object getPropertyObject() {
                return propertyObject;
            }
    
            public void setPropertyObject(Object propertyObject) {
                this.propertyObject = propertyObject;
            }
    
            public List<String> getPropertyArray() {
                return propertyArray;
            }
    
            public void setPropertyArray(List<String> propertyArray) {
                this.propertyArray = propertyArray;
            }
    
            public Object getPropertyNull() {
                return propertyNull;
            }
    
            public void setPropertyNull(Object propertyNull) {
                this.propertyNull = propertyNull;
            }
    
            @Override
            public String toString() {
                return "NormalJson [propertyString=" + propertyString + ", propertyInt=" + propertyInt
                        + ", propertyBoolean=" + propertyBoolean + ", propertyObject=" + propertyObject + ", propertyNull="
                        + propertyNull + ", propertyArray=" + propertyArray + "]";
            }
        }
    }

    运行结果:

    {"propertyString":"hello world","propertyInt":1,"propertyBoolean":true,"propertyObject":{},"propertyNull":null,"propertyArray":["a","b"]}

    七、gson库解析json为map时对于数字的处理:

    解析为map时:

      若用object接收value值时,int、long、float、double都会转为double类型;

      若用string接收value值时,int、long、float、double都会按原有类型转换;

      若用Integer接收value值时,int、long、float、double都会转为intege类型;

      若用Double接收value值时,int、long、float、double都会转为double类型。

    示例如下:

    package com.test.gson;
    
    import java.util.Map;
    
    import com.google.gson.Gson;
    import com.google.gson.reflect.TypeToken;
    
    public class GsonMapDemo {
    
        public static void main(String[] args) {
            JsonMap jsonMap = new GsonMapDemo().new JsonMap();
            jsonMap.setA(1);
            jsonMap.setB(2);
            jsonMap.setC(3);
            jsonMap.setD(4);
            Gson gson = new Gson();
            System.out.println(gson.toJson(jsonMap));
            System.out.println(gson.fromJson(gson.toJson(jsonMap), new TypeToken<Map<String, String>>() {
            }.getType()));
            System.out.println(gson.fromJson(gson.toJson(jsonMap), new TypeToken<Map<String, Object>>() {
            }.getType()));
            System.out.println(gson.fromJson(gson.toJson(jsonMap), new TypeToken<Map<String, Integer>>() {
            }.getType()));
            System.out.println(gson.fromJson(gson.toJson(jsonMap), new TypeToken<Map<String, Double>>() {
            }.getType()));
    
        }
    
        public class JsonMap {
            private int a;
            private long b;
            private float c;
            private double d;
    
            public int getA() {
                return a;
            }
    
            public void setA(int a) {
                this.a = a;
            }
    
            public long getB() {
                return b;
            }
    
            public void setB(long b) {
                this.b = b;
            }
    
            public float getC() {
                return c;
            }
    
            public void setC(float c) {
                this.c = c;
            }
    
            public double getD() {
                return d;
            }
    
            public void setD(double d) {
                this.d = d;
            }
    
            @Override
            public String toString() {
                return "JsonMap [a=" + a + ", b=" + b + ", c=" + c + ", d=" + d + "]";
            }
    
        }
    
    }

    运行结果如下:

    {"a":1,"b":2,"c":3.0,"d":4.0}
    {a=1, b=2, c=3.0, d=4.0}
    {a=1.0, b=2.0, c=3.0, d=4.0}
    {a=1, b=2, c=3, d=4}
    {a=1.0, b=2.0, c=3.0, d=4.0}

          

     

  • 相关阅读:
    对象池使用时要注意几点
    Flash3D学习计划(一)——3D渲染的一般管线流程
    714. Best Time to Buy and Sell Stock with Transaction Fee
    712. Minimum ASCII Delete Sum for Two Strings
    647. Palindromic Substrings(马拉车算法)
    413. Arithmetic Slices
    877. Stone Game
    338. Counting Bits
    303. Range Sum Query
    198. House Robber
  • 原文地址:https://www.cnblogs.com/silenceshining/p/5396190.html
Copyright © 2011-2022 走看看