java构造与解析json数据
一、介绍
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。 易于人阅读和编写。同时也易于机器解析和生成。 它基于JavaScript Programming Language, Standard ECMA-262 3rd Edition - December 1999的一个子集。 JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C, C++, C#, Java, JavaScript, Perl, Python等)。 这些特性使JSON成为理想的数据交换语言。
json具有很多种形式,例如:
对象(object 是一个无序的“‘名称/值’对”集合。一个对象以“{”(左括号)开始,“}”(右括号)结束。每个“名称”后跟一个“:”(冒号);“‘名称/值’ 对”之间使用“,”(逗号)分隔。
想要了解更多信息,请查看json.org,官网上还有各种语言的json数据的实现方式。
二、依赖的jar包
org.json
下载地址:http://mvnrepository.com/artifact/org.json/json
添加maven依赖:
<dependency>
<groupId>org.json</groupId>
<artifactId>json</artifactId>
<version>20160810</version>
</dependency>
三、json构造与解析方法实现
由于json不能直接转换成javaBean,笔者写了一个工具类通过map转换成javaBean,实现javaBean、map与json的相互转换。
代码如下:
package main;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Map;
/**
* Created by asus on 2016/12/22.
* 将map对象转化成javaBean对象
*/
public class BeanUtils {
/**
* 将map对象转化成javaBean对象
*
* @param map map对象
* @param clazz javabean的Class类对象
* @param <T> 泛型
* @return javabean对象
*/
public static <T> T toBean(Map<String, Object> map, Class<T> clazz) {
try {
T bean = clazz.newInstance();
Field[] fields = clazz.getDeclaredFields();
//在map中查找类的字段对应的值,再赋值给bean对象
for (Field field : fields) {
if (map.get(field.getName()) != null) {
//私有变量需要设置访问属性为true
field.setAccessible(true);
field.set(bean, map.get(field.getName()));
}
}
return bean;
} catch (InstantiationException | IllegalAccessException e) {
e.printStackTrace();
}
return null;
}
}
演示样例:
package main;
package top.codesky.test
/**
* Created by asus on 2016/12/22.
* javaBean类
* 由Kotlin语言编写,兼容java
* 明显的减少代码量
*/
class Student {
var id: Int = 0
var name: String? = null
var major: String? = null
override fun toString(): String {
return "Student{" +
"id=" + id +
", name='" + name + '\'' +
", major='" + major + '\'' +
'}'
}
}
package main;
import org.json.JSONArray;
import org.json.JSONObject;
import org.json.JSONStringer;
import org.junit.Test;
/**
* Created by asus on 2016/12/21.
* 测试类
*/
public class TestJson {
/**
* 解析json数据
*/
@Test
public void parseJson() {
//json数据字符串
String jsonString = "{'map':[{'name':'张三', 'age':21, 'major':'计算机'}," +
"{'name':'李四', 'age':20, 'major':'软件工程'}]}";
JSONObject jsonObject = new JSONObject(jsonString);
JSONArray jsonArray = jsonObject.getJSONArray("map");
System.out.println("---------JSONArray数据格式---------");
System.out.println(jsonArray);
JSONObject jo = jsonArray.getJSONObject(0);
System.out.println("---------解析JSON数据---------");
System.out.println("name:" + jo.getString("name") + " age:" + jo.getInt("age")
+" major:"+jo.getString("major"));
}
/**
* 构造json数据
*/
@Test
public void createJson() {
//1.通过JSONObject方式创建
JSONObject studentJson = new JSONObject();
studentJson.put("name", "jack");
studentJson.put("id", 20161222);
studentJson.put("major", "计算机");
System.out.println("---------JSONObject------------");
System.out.println(studentJson);
//json通过map转化成javaBean对象
Student student = BeanUtils.toBean(studentJson.toMap(),Student.class);
System.out.println("---------toJavaBean------------");
System.out.println(student);
//2.通过JSONStringer创建
JSONStringer jsonStringer = new JSONStringer();
//开始创建JSONObject
jsonStringer.object();
jsonStringer.key("name");
jsonStringer.value("jack");
jsonStringer.key("id");
jsonStringer.value(20161222);
jsonStringer.key("major");
jsonStringer.value("计算机");
jsonStringer.endObject();
System.out.println("---------JSONStringer------------");
System.out.println(jsonStringer.toString());
}
}
运行结果:
- 解析json数据
- 构造json数据
这里可以发现用JSONStringer构造的json数据是有序的,
而JSONObject构造的是无序的。
四、总结分析
org.json
是一个轻量级的json解析jar,不依赖其他第三方jar,但是不能直接转换成
javaBean对象,需要通过map进行中转。还有很多种解析方法,有时间再尝试一番。
当然适合需求的才是最好的。
google也把org.json集成到了android sdk中,开发安卓应用的时候可以直接使用了。
OverView:
参考博客
http://www.cnblogs.com/lanxuezaipiao/archive/2013/05/24/3096437.html