Android Json解析 - 初步
扫描二维码
随时随地手机看文章
JSON与XML一样都是数据格式,JSON的数据格式比XML更小。这里主讲JSON。
JSON是JavsScript对象符号。
下面是一个简单的JSON格式
{"name":"zhangsan","age":22,"address":"太原"}
这就是一个对象,里面的值key是冒号前面的类容,value是冒号后面的类容。
JSON还可以有数组的形式,如下:
[{"name":"zhangsan","age":22,"address":"太原"},
{"name":"lisi","age":20,"address":"黄冈"},
{"name":"wangwu","age":21,"address":"武汉"}]
在中括号里全都是对象,这种对象的个数没限制,对象里是键值对。
在JSON对象中还可以有对象,如下:
{
"name":"zhangsan","age":22,
"address":{"country":"中国","province":"山西","city":"太原"}
}
这就是说address key是一个对象。
这就是JSON的基本形式。
首先下载解析JSON需要的Jar包 下载。这是Google提供解析JSON的开源的Json Jar包。
1.最基础的解析
这种解析式最普遍的,根据JSON的格式来解析,我来解析如下的JSON数据:
{"name":"zhangsan","age":22,"address":"太原"}
首先
String s="{"name":"zhangsan","age":22,"address":"太原"}";
这里使用反斜杠来使用双引号。
JsonReader reader=new JsonReader(new StringReader(s));
声明一个JsonReader对象,将String s传入。
try {
JsonReader reader=new JsonReader(new StringReader(data));
reader.beginObject();
while(reader.hasNext())
{
String key=reader.nextName();
if("name".equals(key))
{
System.out.println(reader.nextString());
}
if("age".equals(key))
{
System.out.println(reader.nextInt());
}
if("address".equals(key))
{
System.out.println(reader.nextString());
}
}
reader.endObject();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
结果如下:
开始解析的时候调用reader.beginObject();结束的时候调用reader.endObject().应为一个对象里可能有很多的键值对,所以要使用while循环,当对象里的键值对都循环完了的话reader.hasNext()方法返回false。reader.nextXXX()获得你所要的值,XXX为类型。
2.解析数组
下面解析如下的Json数据:
[{"name":"zhangsan","age":22,"address":"太原"},
{"name":"lisi","age":20,"address":"黄冈"},
{"name":"wangwu","age":21,"address":"武汉"}]
如下代码:
try {
JsonReader reader=new JsonReader(new StringReader(data));
reader.beginArray();
while(reader.hasNext())
{
reader.beginObject();
while(reader.hasNext())
{
String key=reader.nextName();
if("name".equals(key))
{
System.out.println(reader.nextString());
}
if("age".equals(key))
{
System.out.println(reader.nextInt());
}
if("address".equals(key))
{
System.out.println(reader.nextString());
}
}
reader.endObject();
}
reader.endArray();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
根据这个Json的数据结构,我先解析数组,所以开始就reader.beginArray();当然还要reader.endArray();同样使用reader.hasNext()来判断数组是否都解析完了。
下面是效果图:
3.包含对象的对象解析
下面我解析如下的Json数据:
{
"name":"zhangsan","age":22,
"address":{"country":"中国","province":"山西","city":"太原"}
}
废话不多说先来代码:
try {
JsonReader reader=new JsonReader(new StringReader(data));
reader.beginObject();
while(reader.hasNext())
{
String key=reader.nextName();
if("name".equals(key))
{
System.out.println(reader.nextString());
}
if("address".equals(key))
{
reader.beginObject();
while(reader.hasNext())
{
String theKey=reader.nextName();[!--empirenews.page--]
if("country".equals(theKey))
{
System.out.println(reader.nextString());
}
if("province".equals(theKey))
{
System.out.println(reader.nextString());
}
if("city".equals(theKey))
{
System.out.println(reader.nextString());
}
}
reader.endObject();
}
}
reader.endObject();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
都给解析出来了。
1.解析一个对象
可以直接从Json中将队形解析出来,这个Json必须是一个Json对象,如下:
{"name":"zhangsan","age":22,"address":"太原"}
它只是一个对象。
我新建一个类,生成get和set方法,如下:
package com.zhycheng;
publicclass Human {
String name,address;
int age;
public String getName() {
return name;
}
publicvoid setName(String name) {
this.name = name;
}
publicint getAge() {
return age;
}
publicvoid setAge(int age) {
this.age = age;
}
public String getAddress() {
return address;
}
publicvoid setAddress(String address) {
this.address = address;
}
}
然后使用如下代码直接解析
String s="{"name":"zhangsan","age":22,"address":"太原"}";
Gson g=new Gson();
Human h=g.fromJson(s, Human.class);
System.out.println(h.getName()+";"+h.getAge()+";"+h.getAddress());
2.解析数组
下面解析如下的Json数据:
[{"name":"zhangsan","age":22,"address":"太原"},
{"name":"lisi","age":20,"address":"黄冈"},
{"name":"wangwu","age":21,"address":"武汉"}]
代码如下:
String s="[{"name":"zhangsan","age":22,"address":"太原"},{"name":"lisi","age":20,"address":"黄冈"},{"name":"wangwu","age":21,"address":"武汉"}]";
Type type=new TypeToken>(){}.getType();
Gson g=new Gson();
LinkedList ll=g.fromJson(s, type);
for(int i=0;i
{
Human h=(Human)ll.get(i);
System.out.println(h.getName()+","+h.getAge()+","+h.getAddress());
}
在这里要注意:
1.Json里的数据时数组,数组里是对象
2.泛形一定要用,否则出错
项目工程下载。