Json解析详解

来源:互联网 发布:招聘淘宝兼职广告词 编辑:程序博客网 时间:2024/06/05 02:46
一,介绍
Json(JavaScript Object Notation)一种轻量级的数据交换格式。
二,Json数据的格式结构:对象和数组
1.Json对象:“Key/value"(”键/值“)对的无序集合格式
单个键值
{
"name":"xiaoming"
}
多个键值对,中间用","隔开(可读性好,可以看到各个值之间的联系,最后一个键值对不能加括号)
{
"name":"xiaoming",
"age":20
}
2,Json数组:值的有序列表
单个键值
{
"person":[
{"name":"xiaoming","age":10},
{"name":"xiaoming","age":10},
{"name":"xiaoming","age":10}
]
}
多个键值对
{
"programmers":[
{"name":"xiaoming","age":10},
{"name":"xiaoming","age":10},
{"name":"xiaoming","age":10}
]
"student":[
{"name":"xiaoming","age":10},
{"name":"xiaoming","age":10},
{"name":"xiaoming","age":10}
]
"authors":[
{"name":"xiaoming","age":10},
{"name":"xiaoming","age":10},
{"name":"xiaoming","age":10}
]
}
3.嵌套数据
{
"name":"xiaoming",
"age":20,
"student":{
"name":"xiaohong",
"age":10
}
}
三,解析Json数据
1.利用Android API中的JsonReader解析Json数据
Android develop 中的Example
解析嵌套数据
[
{
"id": 912345678901,
"text": "How do I read JSON on Android?",
"geo": null,
"user": {
"name": "android_newb",
"followers_count": 41
},
{
"id": 912345678902,
"text": "@android_newb just use android.util.JsonReader!",
"geo": [50.454722, -104.606667],
"user": {
"name": "jesse",
"followers_count": 2
}
}
]

This code implements the parser for the above structure:
 
public List readJsonStream(InputStream in) throws IOException {
//Creates a new instance that reads a JSON-encoded stream from in.
JsonReader reader = new JsonReader(new InputStreamReader(in, "UTF-8"));
try {
return readMessagesArray(reader);
finally {
reader.close();
}
}
public List readMessagesArray(JsonReader reader) throws IOException {
List messages = new ArrayList();
reader.beginArray();//开始解析数组
while (reader.hasNext()) {//// 判断是否有下一个对象
messages.add(readMessage(reader));
}
reader.endArray();
return messages;
}
public Message readMessage(JsonReader reader) throws IOException {
long id = -1;
String text = null;
User user = null;
List geo = null;
reader.beginObject();
while (reader.hasNext()) {
String name = reader.nextName(); //获取属性名
if (name.equals("id")) {
id = reader.nextLong();//获取属性值,long类型,String会转化,不能转化则出粗
} else if (name.equals("text")) {
text = reader.nextString(); //获取属性值,String类型
} else if (name.equals("geo") && reader.peek() != JsonToken.NULL) {
//Returns the type of the next token without consuming it.
geo = readDoublesArray(reader);
} else if (name.equals("user")) {
user = readUser(reader);
} else {
reader.skipValue();
}
}
reader.endObject();
return new Message(id, text, user, geo);
}
public List readDoublesArray(JsonReader reader) throws IOException {
List doubles = new ArrayList();
reader.beginArray();
while (reader.hasNext()) {
doubles.add(reader.nextDouble());
}
reader.endArray();
return doubles;
}
public User readUser(JsonReader reader) throws IOException {
String username = null;
int followersCount = -1;
reader.beginObject(); //开始解析
while (reader.hasNext()) {
String name = reader.nextName();
if (name.equals("name")) {
username = reader.nextString();
} else if (name.equals("followers_count")) {
followersCount = reader.nextInt();
} else {
reader.skipValue();
}
}
reader.endObject(); //结束解析
return new User(username, followersCount);
}}
解析单个键/值对
private void jsonReaderTest() {
// 这里的Json放到string中,所以加上了转译
String jsonString = "{\"name\":\"xiaoming\",\"age\":20}";
 
JsonReader reader = new JsonReader(new StringReader(jsonString));
try {
reader.beginObject();
while (reader.nextName()) {
String tagName = reader.nextName();
if (tagName.equals("name")) {
System.out.println(reader.nextString());
} else if (tagName.equals("age")) {
System.out.println(reader.nextString());
}
}
reader.endObject(); // 结束对象的解析
} catch (IOException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
解析多个键/值对
private void jsonReaderTest() {
// 这里的Json放到string中,所以加上了转译
String jsonString = "[{\"name\":\"xiaoming\",\"age\":20},{\"name\":\"xiaohong\",\"age\":10}]";
 
JsonReader reader = new JsonReader(new StringReader(jsonString));
try {
reader.beginArray();
while (reader.hasNext()) {
reader.beginObject();
while (reader.hasNext()) {
String tagName = reader.nextName();
if (tagName.equals("name")) {
System.out.println(reader.nextString());
} else if (tagName.equals("age")) {
System.out.println(reader.nextString());
}
}
reader.endObject(); // 结束对象的解析
}
reader.endArray(); // 结束解析当前数组
} catch (IOException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
2,通过Gson解析Json
1.解析单个键/值对
{
"name":"xiaoming",
"age":20
}
根据数据的格式定义一个类
(类里面的成员变量必须和Json字段里面的name,age一样,会自动对应)
 
public class Student {
public Student(String name,int age){
this.name = name;
this.age = age;
}
public String name;
public int age;
}
解析
String jsonData = "{\"name\":\"xiaoming\",\"age\":10}";
Student student = gson.fromJson(jsonData, Student.class);
if (student.name.equals("xiaoming")) {
System.out.println(student.age);
}
System.out.println(student.age+student.name);
2,解析多个键/值对
//解析数组
String jsonDatas = "[{\"name\":\"xiaoming\",\"age\":10},{\"name\":\"xiaohong\",\"age\":15}]";
Student[] students = gson.fromJson(jsonDatas, Student[].class);
for (int i = 0; i < students.length; i++) {
System.out.println(students[i].age);
System.out.println(students[i].name);
}
 
//解析列表
ArrayList<Student> list = gson.fromJson(jsonDatas,new TypeToken<ArrayList<Student>>(){}.getType());
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i).name);
System.out.println(list.get(i).age);
}
3,解析嵌套数据
String jsonData2 = "{\"name\":\"xiaoming\",\"age\":10,\"middle\":{\"name\":\"lili\",\"age\":20}}";
StudentMiddle studentMiddle = gson.fromJson(jsonData2, StudentMiddle.class);
System.out.println(studentMiddle.middle.name);
public class StudentMiddle {
public String name;
public int age;
public Middle middle;
public class Middle{
public String name;
public int age;
}
}

 


 
0 0
原创粉丝点击