Java解析Json字符串--单个实体
Java解析Json字符串--单个实体
最基础的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)
如何处理JSON中的特殊字符
Struts中异步传送XML和JSON类型的数据
Linux下JSON库的编译及代码测试
jQuery 获取JSON数据[$.getJSON方法]
用jQuery以及JSON包将表单数据转为JSON字符串
在C语言中解析JSON配置文件
--------------------------------------分割线 --------------------------------------
然后,我们给所有的成员变量生成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}
评论暂时关闭