歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Java解析Json字符串--單個實體

Java解析Json字符串--單個實體

日期:2017/3/1 9:18:43   编辑:Linux編程

最基礎的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}

Copyright © Linux教程網 All Rights Reserved