json解析算得上是Android开发中的家常便饭了,绝大部分的应用或多或少都会用到json解析,当然可能他们用的是Gson解析。其实Gson解析用起来确实比Json方便,但是不管怎样,熟练使用Json解析是必要的。今天就对自己这两天来对Json数据解析的使用整理一下写出来供大家分享。基础讲解来说还算周到,只是这里不讲太多例子,况且百度一下json解析,很多例子可以看。
转载请注明出处:http://blog.youkuaiyun.com/yang_ge_98/article/details/47344145 谢谢
1、首先需要说明的是服务器端(Java web)没有解析Json相关的api,要想在服务器端使用Json解析,就必须导入第三方的工具包。包的地址:http://download.youkuaiyun.com/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() 方法可以转换。但是使用起来有点麻烦,这里也说的差不多了。有时间会讲解这几个方法。
1952

被折叠的 条评论
为什么被折叠?



