FastJson使用示例。[转]Android解析json数据。

同样,几独基本概念

1、json格式

①JSONArray
相当于 JAVA中的List<Object>,如:[‘a’,’b’,’c’….]

2、json解析

②JSONObject相当于JAVA中的Map<String,
Object>,如:{‘1′:’a’, ‘2’:’b’…}

3、gson解析

③对于具有组织层次的JSON格式的数据,可以一样重合一交汇地来分析,可参看:就篇文章

4、fastjson解析

 

一、Json格式

其次,当用分析的JSON文件特别充分时,可运JSON
Stream
API,比如如下
List类型的数据在 F:\\test.txt 中,假设有上万长时…:

json一种植轻量级的数据交换格式。在网达到传交换数据貌似用xml, json。

[
{"begin_int":"1677721","end_int":"1677747"},
{"begin_int":"1677747","end_int":"1677823"},
{"begin_int":"1677824","end_int":"1677926"},
{"begin_int":"1677926","end_int":"1678131"},
{"begin_int":"1678131","end_int":"1678540"},
{"begin_int":"1678540","end_int":"1679359"},
{"begin_int":"1690880","end_int":"1690905"},
{"begin_int":"1690905","end_int":"1690931"},
{"begin_int":"1690931","end_int":"1690956"},
{"begin_int":"1690956","end_int":"1690982"}
]

些微种结构:

 

1)对象(key-value集合)

解析代码:将List中之每个元素当作一个Object

 {“id”:”1001″,”name”:”zhangshan”,”address”:”shanghai”}

 1 import java.io.File;
 2 import java.io.FileNotFoundException;
 3 import java.io.FileReader;
 4 
 5 import com.alibaba.fastjson.JSONReader;
 6 
 7 public class ParseListByFastJsonStreamApi {
 8 
 9     private static final String FILE_PATH = "F:\\test.txt";
10     
11     public static void main(String[] args) throws FileNotFoundException{
12         
13         JSONReader jsonReader = new JSONReader(new FileReader(new File(FILE_PATH)));
14         
15         jsonReader.startArray();//---> [
16         
17         while(jsonReader.hasNext())
18         {
19             String info = jsonReader.readObject().toString();//---> {"key":"value"}
20             System.out.println(info);
21         }
22         jsonReader.endArray();//---> ]
23         jsonReader.close();
24     }
25 }

2)数组(数组对象),以[  ] 包括的key-value对象

 

{“students”:[{“sid”:1001,”name”:”zhangsan”,”addr”:”Yichang”,”pic”:”111.jpg”}, 
                                         
 {“sid”:1002,”name”:”Jack”,”addr”:”Beijing”,”pic”:”222.jpg”}]}

或者用如下代码来分析:(将List中的每个元素(如: {“begin_int”:”1690956″,”end_int”:”1690982″})再进一步分解
成 Key 和 Value 对)

 

 1     public static void parse() throws FileNotFoundException{
 2             
 3             JSONReader jsonReader = new JSONReader(new FileReader(new File(FILE_PATH)));
 4             
 5             jsonReader.startArray();//---> [
 6             
 7             while(jsonReader.hasNext())
 8             {
 9                 jsonReader.startObject();
10                 while(jsonReader.hasNext()) {
11                     String objKey = jsonReader.readString();
12                     String objVal = jsonReader.readObject().toString();
13                     System.out.println("key: " + objKey + ", value: " + objVal);
14                 }
15                 jsonReader.endObject();
16             }
17             jsonReader.endArray();//---> ]
18             jsonReader.close();
19     }

或:

地方的第9行 和
第10尽解析代码也证明了:“JSONObject相当于JAVA中的Map<String,
Object>”。

{[{“sid”:1001,”name”:”zhangsan”,”addr”:”Yichang”,”pic”:”111.jpg”},   
                                       
 {“sid”:1002,”name”:”Jack”,”addr”:”Beijing”,”pic”:”222.jpg”}]}

要因
JAVA Bean 类来分析:

 

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;

import com.alibaba.fastjson.JSONReader;

public class ParseListByFastJsonStreamApi {

    private static final String FILE_PATH = "F:\\test.txt";

    public static void main(String[] args) throws FileNotFoundException{

        JSONReader jsonReader = new JSONReader(new FileReader(new File(FILE_PATH)));

        jsonReader.startArray();//---> [

        while(jsonReader.hasNext())
        {
            BeginEndBean obj = jsonReader.readObject(BeginEndBean.class);//根据 java bean 来解析
            int begin_int = obj.getBegin_int();
            int end_int = obj.getEnd_int();
            System.out.println("begin_int:" + begin_int + ", end_int" + end_int); 
        }
        jsonReader.endArray();//---> ]
        jsonReader.close();
    }
}

次、json数据变化,解析

 

JSONObject,代表了一个JSON对象,可以成功Java对象以及JSON字符串之间的相互转换。

JAVA Bean类如下:

JSONArray,代表一个JSON数组,可以成功Java集合(集合元素可以是目标)与JSON字符串之间的变。

 1 public class BeginEndBean {
 2     private int begin_int;
 3     private int end_int;
 4     public int getBegin_int() {
 5         return begin_int;
 6     }
 7     public void setBegin_int(int begin_int) {
 8         this.begin_int = begin_int;
 9     }
10     public int getEnd_int() {
11         return end_int;
12     }
13     public void setEnd_int(int end_int) {
14         this.end_int = end_int;
15     }
16 }

 

 

1、Java对象与JSON字符串相互转换

其三,当得解析JSON数据格式有点复杂(非扁平的多少)时,比如下面的JSON格式数据:

方式一:

{"key":"value","anotherKey":[
{"begin_int":"1677721","end_int":"1677747"},
{"begin_int":"1687552","end_int":"1690828"},
{"begin_int":"1690905","end_int":"1690931"},
{"begin_int":"1690931","end_int":"1690956"},
{"begin_int":"1690956","end_int":"1690982"}
],"thirdKey":{"subKey":"subVal","anotherSubKey":["1","2","3"]}}

Student stu = new Student(1005,”张三”,”Wuhan”,”zs.jpg”);

“key”
对应之尽管是特发一个价值,”anotherKey”对应的凡一个列表,”thirdKey”对应之是一个靶(Map)。

JSONObject jsonObject = new JSONObject(stu);

剖析代码如下:

 

第17行,将全部Json格式的公文作为一个JSONObject,该JSONObject里面有三个子元素,分别是:”key”
、”anotherKey”、”thirdKey”。因此第18实行 while(hasNext())找到每个key,然后
if-else
分别解析对应的值。比如第25实践,解析到”anotherKey”时,它对应之凡一个List,因此在第26履行
startArray() 来读取

               
  jsonObject.toString()就是字符串输出: {“sid”:1005,”name”:”张三”,”addr”:”Wuhan”,”pic”:”zs.jpg”}

出于List中之每个元素其实以是一个个底:{“begin_int”:”1687552″,”end_int”:”1690828″}

 

因此,第29行又开启 startObject()
读取,而每个{“begin_int”:”1687552″,”end_int”:”1690828″} 又有三三两两只
”xxx_int“:”xxx”,因此第30履以产生一个while(hasNext())循环。

剖析为对象:

总而言之,读取Map格式的多寡对应之是JSONObject,读取的方就是是
jsonReader.readObject()

JSONObject jsonObject = new JSONObject(str);

 读取复杂格式的JSON数据常常,解析的规则就是如是“剥洋葱”一样,一交汇一重叠地来分析相应的目标(Object/List)

 

 1 import java.io.File;
 2 import java.io.FileNotFoundException;
 3 import java.io.FileReader;
 4 import com.alibaba.fastjson.JSONReader;
 5 
 6 public class ParseListByFastJsonStreamApi {
 7 
 8     private static final String FILE_PATH = "F:\\test.txt";
 9 
10     public static void main(String[] args) throws FileNotFoundException {
11         parseData();
12     }
13 
14     public static void parseData() throws FileNotFoundException {
15         JSONReader jsonReader = new JSONReader(new FileReader(new File(FILE_PATH)));
16         
17         jsonReader.startObject();//将整个json文件当作 Map<String,Object> 对象来解析 {,}
18         while(jsonReader.hasNext()) {
19             String key = jsonReader.readString();
20             if(key.equals("key"))//"key"对应的Object只有一个
21             {
22                 Object obj = jsonReader.readObject();//
23                 String val = obj.toString();
24                 System.out.println("obj: " + obj + ", value: " + val);
25             }else if(key.equals("anotherKey")) {//"anotherKey"对应的是一个List对象
26                 jsonReader.startArray();//---> [  开启读List对象
27                 while(jsonReader.hasNext()) {
28                     
29                     jsonReader.startObject();
30                     while(jsonReader.hasNext()) {
31                         String objKey = jsonReader.readString();
32                         String objVal = jsonReader.readObject().toString();
33                         System.out.println("objKey: " + objKey + ", objVal: " + objVal);
34                     }
35                     jsonReader.endObject();
36                 }
37                 jsonReader.endArray();//---> ]
38             }else if(key.equals("thirdKey")) {
39                 jsonReader.startObject();//{"subKey":"subVal","anotherSubKey":["1","2","3"]}
40                 while(jsonReader.hasNext()) {
41                     String sub_key = jsonReader.readString();
42                     Object third_obj = jsonReader.readObject();
43                     String subVal = third_obj.toString();
44                     System.out.println("sub_key: " + sub_key + ", subVal: " + subVal);
45                 }
46                 jsonReader.endObject();
47             }
48         }
49         jsonReader.endObject();
50         jsonReader.close();
51     }
52 }

Iterator<String> iterator = jsonObject.keys();

 

Student stu = new Student();

呢得以借助JAVA Bean 来分析 anotherKey 对应之 List 对象。代码如下:

 

新普京 1新普京 2

while(iterator.hasNext()){

 1 public class ParseListByFastJsonStreamApi {
 2 
 3     private static final String FILE_PATH = "F:\\test.txt";
 4 
 5     public static void main(String[] args) throws FileNotFoundException {
 6         parseData();
 7     }
 8 
 9     public static void parseData() throws FileNotFoundException {
10         JSONReader jsonReader = new JSONReader(new FileReader(new File(FILE_PATH)));
11         
12         jsonReader.startObject();//将整个json文件当作 Map<String,Object> 对象来解析 {,}
13         while(jsonReader.hasNext()) {
14             String key = jsonReader.readString();
15             if(key.equals("key"))//"key"对应的Object只有一个
16             {
17                 Object obj = jsonReader.readObject();//
18                 String val = obj.toString();
19                 System.out.println("obj: " + obj + ", value: " + val);
20             }else if(key.equals("anotherKey")) {//"anotherKey"对应的是一个List对象
21                 jsonReader.startArray();//---> [  开启读List对象
22                 while(jsonReader.hasNext()) {
23                     BeginEndBean objBean = jsonReader.readObject(BeginEndBean.class);
24                     int begin_int = objBean.getBegin_int();
25                     int end_int = objBean.getEnd_int();
26                     System.out.println("begin_int: " + begin_int + ", " + end_int);
27                 }
28                 jsonReader.endArray();//---> ]
29             }else if(key.equals("thirdKey")) {
30                 jsonReader.startObject();//{"subKey":"subVal","anotherSubKey":["1","2","3"]}
31                 while(jsonReader.hasNext()) {
32                     String sub_key = jsonReader.readString();
33                     Object third_obj = jsonReader.readObject();
34                     String subVal = third_obj.toString();
35                     System.out.println("sub_key: " + sub_key + ", subVal: " + subVal);
36                 }
37                 jsonReader.endObject();
38             }
39         }
40         jsonReader.endObject();
41         jsonReader.close();
42     }
43 }

//可以利用java反射,写泛型方法

View Code

String key = iterator.next();

 

if(key.equals(“sid”)){

少数栽艺术的相比如下:

stu.setSid(jsonObject.getInt(key));

 1 else if(key.equals("anotherKey")) {//"anotherKey"对应的是一个List对象
 2                 jsonReader.startArray();//---> [  开启读List对象
 3                 while(jsonReader.hasNext()) {
 4                     BeginEndBean objBean = jsonReader.readObject(BeginEndBean.class);
 5                     int begin_int = objBean.getBegin_int();
 6                     int end_int = objBean.getEnd_int();
 7                     System.out.println("begin_int: " + begin_int + ", " + end_int);
 8                 }
 9                 jsonReader.endArray();//---> ]
10             }
11 
12 
13 ---------------------------------------------------------------------------
14 
15 else if(key.equals("anotherKey")) {//"anotherKey"对应的是一个List对象
16                 jsonReader.startArray();//---> [  开启读List对象
17                 while(jsonReader.hasNext()) {
18                     jsonReader.startObject();
19                     while(jsonReader.hasNext()) {
20                         String objKey = jsonReader.readString();
21                         String objVal = jsonReader.readObject().toString();
22                         System.out.println("objKey: " + objKey + ", objVal: " + objVal);
23                     }
24                     jsonReader.endObject();
25                 }
26                 jsonReader.endArray();//---> ]
27             }

}

 

 

FastJson
官方github资料

if(key.equals(“name”)){

stu.setName(jsonObject.getString(key));

}

 

if(key.equals(“sid”)){

stu.setAddr(jsonObject.getString(key));

}

 

if(key.equals(“sid”)){

stu.setPic(jsonObject.getString(key));

}

}

 

方式二:

                           Student stu
= new Student(1005, “张三”, “Wuhan”, “zs.jpg”);

JSONObject jsonObject = new JSONObject();

jsonObject.put(“zs”, stu);

 

          同样jsonObject.toString()就是字符串输出 {“zs”:”{sid:1005,
name:张三, addr:Wuhan,
pic:zs.jpg}”}。要留意,如果Student没有覆写toString()方法,输入的是:{“zs”:”org.itair.domain.Student@2666e815″}

 

 

 

 

2、集合与JSON字符串相互转换

方式一、

转换:

Student s1 = new Student(1001,”zhangsan”,”yichang”,”111″);

Student s2 = new Student(1002,”Jack”,”Beijing”,”222″);

 

List<Student> stus = new ArrayList<Student>();

 

stus.add(s1);

stus.add(s2);

 

JSONArray array = new JSONArray(stus);

 

               
array的字符串是:[{“sid”:1001,”name”:”zhangsan”,”addr”:”yichang”,”pic”:”111″},{“sid”:1002,”name”:”Jack”,”addr”:”Beijing”,”pic”:”222″}]

 

解析:

                           JSONArray jsonArray
= new JSONArray(“要分析的json字符串”);

 

for (int i = 0; i < jsonArray.length(); i++) {

JSONObject jsonObject2 = jsonArray.getJSONObject(i);

//解析成特定的目标操作,new对象,从jsonObject2取得有价值来诈上

Iterator<String> iterator = jsonObject2.keys();

while (iterator.hasNext()) {

String key = iterator.next();

Object value = jsonObject2.get(key);

map.put(key, value);

}

}

 

方式二、

转换:

  Student s1 = new Student(1001,”zhangsan”,”yichang”,”111″);

Student s2 = new Student(1002,”Jack”,”Beijing”,”222″);

 

List<Student> stus = new ArrayList<Student>();

 

stus.add(s1);

stus.add(s2);

 

JSONObject jsonObject = new JSONObject();

jsonObject.put(“students”, stus);

                

               
jsonObject的字符串:{“students”:[{“sid”:1001,”name”:”zhangsan”,”addr”:”yichang”,”pic”:”111″},{“sid”:1002,”name”:”Jack”,”addr”:”Beijing”,”pic”:”222″}]}

 

解析:

       由于地方的易方式是将集对象放置 JSONObject中。

       

  JSONObject jsonObject = new JSONObject(“要分析的json字符串”);

JSONArray jsonArray =
jsonObject.getJSONArray(“key”);//key就是地方放入的students

              后面的代码和齐循环。

                

 

于Android的路受到,一般不会见把Json字符串解析成对象的集纳,而大多是分析成List<Map<String,Object>> 

 

List<Map<String,Object>> list
= new ArrayList<Map<String ,Object>>();

 

for (int i = 0; i < jsonArray.length(); i++) {

JSONObject jsonObject2 = jsonArray.getJSONObject(i);

Map<String ,Object> map = new HashMap<String, Object>();

Iterator<String> iterator = jsonObject2.keys();

while (iterator.hasNext()) {

String key = iterator.next();

Object value = jsonObject2.get(key);

map.put(key, value);

}

 

list.add(map);

 

}

 

假设解析成对象集合,还是用Gson, fastjson比较方便。

 

三、Gson

toJson(Object)  把对象转为json字符串

fromJson(String, Object)   把json字符串转为对象

发表评论

电子邮件地址不会被公开。 必填项已用*标注