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() 方法可以转换。但是使用起来有点麻烦,这里也说的差不多了。有时间会讲解这几个方法。
- Json解析完全解析
- 国家气象局天气预报接口JSON完全解析
- Android:国家气象局天气预报接口JSON完全解析
- 【JSON解析】JSON解析
- JSON解析,XML解析
- JSON解析、XML解析
- XML解析 JSON解析
- JSON解析 GSON解析
- XML解析、Json解析
- Json解析,FastJson解析
- JSON解析/XML解析
- 解析JSON
- Json解析
- JSON解析
- JSON解析
- json解析
- Json解析
- Json解析
- POJ-1207 The 3n + 1 problem
- 友善之臂mini2440的linux系统快速搭建
- Oracle经典查询练手第一篇
- Mac O X 下编译Chromium
- HDU - 1247 Hat’s Words 字典树
- Json解析完全解析
- ZOJ3818 Pretty Poem(暴力)
- POJ 2864 Pascal Library 水
- 黑马程序员--- objective-c 匿名类的使用
- 获取android手机版本
- POJ-1316 Self Numbers-自数
- Java — 开发环境(Core Java I)
- hdu 1063 Exponentiation(有小数的高精)
- 如何使自己编译的驱动程序具有读写权限