Json解析完全解析

来源:互联网 发布:sql 修改字段的默认值 编辑:程序博客网 时间:2024/05/02 06:45

json解析算得上是Android开发中的家常便饭了,绝大部分的应用或多或少都会用到json解析,当然可能他们用的是Gson解析。其实Gson解析用起来确实比Json方便,但是不管怎样,熟练使用Json解析是必要的。今天就对自己这两天来对Json数据解析的使用整理一下写出来供大家分享。基础讲解来说还算周到,只是这里不讲太多例子,况且百度一下json解析,很多例子可以看。


转载请注明出处:http://blog.csdn.net/yang_ge_98/article/details/47344145  谢谢

1、首先需要说明的是服务器端(Java web)没有解析Json相关的api,要想在服务器端使用Json解析,就必须导入第三方的工具包。包的地址:http://download.csdn.net/detail/yang_ge_98/8975253。需要的自己下载。将包导入工程下,就可以使用Json中的api进行json解析了。


2、Android端有自己的Json解析的api,可以使用它里面的api进行解析。不过使用起来没有第三方的Json全面,主要是轻易导入第三方的包到安卓应用中还会报错。鉴于种种情况,Android端使用Gson解析还是比较方便的.关于Gson解析这里不多说,以后有空还会写一篇新的博客专门说这个Gson解析。


服务器端Json解析我打算从Java对象转Json字符串和从json字符串转Java对象讲述。

(1):

1)基本数据类型使用JSONObject.fromBean()、JSONObject.fromObject()都不能正确转为理想的JSONObject对象。只能使用put()方法转换。

2)JSONObject的put()方法可以将很多数据类型转成对应JSON对象。可将基本类型、Collection集合、Map集合以及Object转成JSONObject对象,再通过toString()方法转成json字符串。

3)fromBean( Object o) 可以将一个 Object 类型转成JSONObject对象,这个Object 参数要是自定义的类型,基本数据类型的不行。我觉得应该是要求Object 中有属性吧。不然键值对建立不起来。所以打印基本数据类型时就打印一对花括号。

4)fromBean() 与 fromObject() 是一样的,直接将一个Object对象变成一个JSONObject对象

fromJsonObject()将JSONObject 变成另一个JSONObject,无聊的方法。

fromMap()  方法用的还是比较多的,直接可以将一个Map集合变成一个JSONObject对象。

fromString()  方法将一个json字符串变成一个JSONObject。

你会发现这里没有fromList()  或者fromArray()方法,这个应该不难理解吧。因为JSONObject  说白了就是一个花括号,里面是一堆键值对,fromList()  或者fromArray() 对应一个JSONArray,就是一个中括号括起来一堆有序的值(这些值可以是基本类型数据、Object数组、JSONObject、JSONArray的一种

5)对应 的toBean(JSONObject o ) 将JSONObject转成Java对象。

6)get()  方法和 opt()  方法都是取得JSONObject中的某个值。区别在于opt()  方法取不出值时不会报异常,而是友好的给个缺省值,可以指定这个缺省值。

(2):

1)JSONArray下有fromArray( Object[] array)  、fromCollection( ... )  、fromObject(  Object  o )  、fromString(  String str  )等等。看到他们的名字就知道什么意思怎么用了。这里比较奇怪的方法就是 fromObject(  Object  o ) 。不过这个方法看起来就知道用的不多,这里也不花时间去说这个方法什么意思。

2)toArray(  JSONArray  array) 、 toList( JSONArray array )  这两个方法就很容易知道他们什么意思了。不过这两个方法不好用,因为要花一段时间才能够说得清楚,这里先放下,下次直说。

最奇葩的方法:toJsonObject(JSONArray array )。字面上的意思就是转成JSONObject对象。确实如此,不过有点奇葩。通过代码就可以发现。

Person p1 = new Person(20 , "xiaoming");

Person p2 = new Person(21 , "xiaoming");

Person p3 = new Person(22 , "xiaoming");

List<Person> list = new ArrayList<Person> ();

list.add( p1 );

list.add( p2 );

list.add( p3 );

JSONArray  array =  JSONArray.fromCollection( list );

JSONObject json = array.toJSONObject(  array  );


分别打印array.toString() 和json.toString() 

array.toString():

[ {  "id":20,"name":"xiaoming" },  {  "id":21,"name":"xiaoming" }, {  "id":22,"name":"xiaoming" }  ]


json.toString() :这个结果我们一般掌握不了,也不好操控,多以我们经常也不用这个方法,直接使用JSONObject的put()  方法更好。

{

" { \ "id \":21,  \"name  \":  \"xiaoming  \" }"  : {  "id":21,"name":"xiaoming" },  

" { \ "id \":22,  \"name  \":  \"xiaoming  \" }"  : {  "id":22,"name":"xiaoming" },  

" { \ "id \":20,  \"name  \":  \"xiaoming  \" }"  : {  "id":20,"name":"xiaoming" },  

}

他用数组的每个元素的"字符串"  格式做 key  ,值又是该数组的元素。


(3)api其实不难理解,只要是没有全局的总结过而已。这样一说出来心中有数就会觉得Json解析也挺简单的。服务器端要做的事情无非就两件,解析客户端传输过来的JSON数据,然后将结果打包成Json字符串返回给用户。下面就用一个例子进行说明。

1)Student类

<span style="font-size:14px;">public class Student {String school;Person person;public Student(String school,Person person){this.person = person;this.school = school;}public String getSchool() {return school;}public void setSchool(String school) {this.school = school;}public Person getPerson() {return person;}public void setPerson(Person person) {this.person = person;}}</span>

2)Person类

<span style="font-size:14px;">public class Person {     private int id;     private String name;     private String address;          public Person() {         super();     }     public Person(int id, String name, String addrss) {         super();         this.id = id;         this.name = name;         this.address = addrss;     }     public int getId() {         return id;     }     public void setId(int id) {         this.id = id;     }     public String getName() {         return name;     }     public void setName(String name) {         this.name = name;     }     public String getAddress() {         return address;     }     public void setAddress(String address) {         this.address = address;     }     @Override     public String toString() {         return "Person [addrss=" + address + ", id=" + id + ", name=" + name                 + "]";     }      } </span>

3)json解析得到json字符串:List形式

public class JsonTest {public static String getJsonString(){String jsonString = "";         Student stu = new Student("仲恺", new Person(20, "张三", "广东清远"));        Student stu1 = new Student("中大", new Person(20, "李四", "湖南长沙"));        Student stu2 = new Student("广大", new Person(20, "黑鬼", "广大湛江"));                List<Student> list = new ArrayList<Student>();        list.add(stu);        list.add(stu1);        list.add(stu2);                JSONArray json = JSONArray.fromCollection(list);        jsonString = json.toString();                return jsonString;}}

Map形式:

public class JsonTest {public static String getJsonString(){String jsonString = "";         Student stu = new Student("仲恺", new Person(20, "张三", "广东清远"));        Student stu1 = new Student("中大", new Person(20, "李四", "湖南长沙"));        Student stu2 = new Student("广大", new Person(20, "黑鬼", "广大湛江"));                Map<String,Student> map = new HashMap<String,Student>();        map.put("person", stu);        map.put("person1", stu1);        map.put("person2", stu2);        <span style="color:#ff0000;"> </span><span style="color:#000099;">       JSONObject json = new JSONObject();        json.put("map", map);</span><span style="color:#ff0000;">————————这两句还可以写成:JSONObject json = JSONObject.fromMap(  map  );不过结果不一样</span>        jsonString = json.toString();                return jsonString;}}

4)json字符串转成Java对象。


第一种方法就是使用get()  和  opt()  方法一层层解析,取到值之后封装起来。一般的应用这样做没有问题。

String jsonString = JsonTest.getJsonString();List<Student> listStudent = new ArrayList<Student>();JSONArray array = JSONArray.fromString(jsonString);for(int i= 0;i<array.length();i++){JSONObject object = array.getJSONObject(i);String school = object.getString("school");JSONObject json = object.getJSONObject("person");int id = Integer.parseInt(json.getString("id"));String name = json.getString("name");String address = json.getString("address");Person person = new Person(id, name, address);Student student = new Student(school, person);listStudent.add(student);}

当然有些觉得麻烦的人会将JSON操作封装起来,要转换直接从里面调用方法就好。这个其实挺好的。


另一种方法就是使用toXXX()  方法直接转换。对于JSONArray有toArray()  和toList()  方法可以转换,对于JSONObject有toBean() 方法可以转换。但是使用起来有点麻烦,这里也说的差不多了。有时间会讲解这几个方法。



0 0