最基礎的Json字符串:
{
"age": 20,
"gender": "male",
"grades": "三班",
"name": "蘇三",
"weight": 63.5
}
上邊是一個很基礎的Json字符串,當我們看到這個字符串的時候,我們就要考慮,怎麼解析這個Json字符串,解析後我們把信息放到一個什麼樣的實體類中。
首先,因為Json最外層使用”{}”大括弧包裹,我們能判斷出,我們需要的最外層是一個類,而不是數組或者列表。那麼我們定義一個類來對應它,Student.java。
接下來,我們分析一下此Json字符串中的屬性元素。age對應的值是一個整數20,那麼,我們就在Student類中對應的定義一個private的整形成員變量;age,gender、grades、name對應的值為字符串類型,那麼,我們也相應的定義三個private的字符串成員變量;weight對應的值是一個有一位小數的浮點型,那麼,我們定義一個private的float型的成員變量。(定義的成員變量名字最好跟Json字符串中的元素名字相同,這樣在我們通過類來轉Json字符串的時候,就能很好的對應)。
--------------------------------------分割線 --------------------------------------
[譯]JSON數據范式化(normalizr) http://www.linuxidc.com/Linux/2016-02/128288.htm
如何處理JSON中的特殊字符 http://www.linuxidc.com/Linux/2015-09/123067.htm
Struts中異步傳送XML和JSON類型的數據 http://www.linuxidc.com/Linux/2013-08/88247.htm
Linux下JSON庫的編譯及代碼測試 http://www.linuxidc.com/Linux/2013-03/81607.htm
jQuery 獲取JSON數據[$.getJSON方法] http://www.linuxidc.com/Linux/2013-03/81673.htm
用jQuery以及JSON包將表單數據轉為JSON字符串 http://www.linuxidc.com/Linux/2013-01/77560.htm
在C語言中解析JSON配置文件 http://www.linuxidc.com/Linux/2014-05/101822.htm
--------------------------------------分割線 --------------------------------------
然後,我們給所有的成員變量生成get/set方法。
我們生成的Student.java如下:
package com.bean;
/**
* 學生
*/
public class Student {
private int age;//年齡
private String gender;//性別,male/female
private String grades;//班級
private String name;//姓名
private float weight;//體重
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public String getGrades() {
return grades;
}
public void setGrades(String grades) {
this.grades = grades;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public float getWeight() {
return weight;
}
public void setWeight(float weight) {
this.weight = weight;
}
}
1
現在我們要將這個Json字符串內容解析出來並存放到Student實體類中:
第一種方法,直接通過JSONObject將Json字符串轉成Student。
package com.test;
import net.sf.json.JSONObject;
import com.bean.Student;
public class Domain {
public static void main(String[] args) {
String jsonStr = "{\"age\":20,\"gender\":\"male\",\"grades\":\"三班\",\"name\":\"蘇三\",\"weight\":63.5}";
JSONObject jsonObject = JSONObject.fromObject(jsonStr);
Student stu = (Student) JSONObject.toBean(jsonObject, Student.class);
System.out.println(stu.getName());
}
}
說明:
這種方法,需要類中的成員變量名跟Json字符串中元素名相同;
Student類中成員變量必須有set方法,因為JSONObject通過toBean方法將Json字符串中元素的值賦給Student類中變量時,是通過set方法來賦值的。這也給我們解釋了為什麼1中說的名稱要相同了;
當Student類中多了一些Json字符串中沒有的成員變量,或者Json字符串多了一些Student類中沒有的元素時,程序並不會報錯,只是這些值在解析時,不會解析到我們的Student類中而已。
如果類中成員變量的類型跟Json字符串對應的類型不統一的話,也是有可能解析不到值的,如age值為字符串”abc”,在類中用int型age成員變量是接收不到值的。
第二種方法:從JSONObject獲取各個元素對應的值
package com.test;
import net.sf.json.JSONObject;
public class Domain {
public static void main(String[] args) {
String jsonStr = "{\"age\":20,\"gender\":\"male\",\"grades\":\"三班\",\"name\":\"蘇三\",\"weight\":63.5}";
JSONObject jsonObject = JSONObject.fromObject(jsonStr);
int age = jsonObject.getInt("age");
String gender = jsonObject.getString("gender");
String grades = jsonObject.getString("grades");
String name = jsonObject.getString("name");
float weight = (float) jsonObject.getDouble("weight");
System.out.println(age);
System.out.println(gender);
System.out.println(grades);
System.out.println(name);
System.out.println(weight);
}
}
說明:
這種方式不需要我們定義的變量名跟Json字符串中的元素名相同,如我們也可以這樣String studentName = jsonObject.getString(“name”);
如果我們取的元素在Json字符串中不存在的話,會報錯;
如果我們取的元素類型跟接收的類型不同的話,可能會報錯;
第三種方法:用迭代器迭代輸出
package com.test;
import java.util.Iterator;
import net.sf.json.JSONObject;
public class Domain {
@SuppressWarnings("rawtypes")
public static void main(String[] args) {
String jsonStr = "{\"age\":20,\"gender\":\"male\",\"grades\":\"三班\",\"name\":\"蘇三\",\"weight\":63.5}";
JSONObject jsonObject = JSONObject.fromObject(jsonStr);
Iterator keys = jsonObject.keys();
String key = null;
Object value = null;
while(keys.hasNext()){
key = (String) keys.next();
value = jsonObject.get(key);
System.out.println("key:"+key+" value:"+value.toString());
}
}
}
說明:
通過這種迭代,能將所有的元素都獲取到;
用迭代的方式我們無法提前定義到每種元素對應value的類型。
最後,我們來看一下,怎麼反向通過Student類來生成一個Json字符串
package com.test;
import net.sf.json.JSONObject;
import com.bean.Student;
public class Domain {
public static void main(String[] args) {
Student stu = new Student();
stu.setAge(25);
stu.setGender("female");
stu.setGrades("一班");
stu.setName("露西");
stu.setWeight(51.3f);
String jsonStr = JSONObject.fromObject(stu).toString();
System.out.println(jsonStr);
}
}
生成的字符串為:
{"age":25,"gender":"female","grades":"一班","name":"露西","weight":51.3}