最近一直忙着做毕设,好长时间没写博客了,正好今天有时间,写一篇实习过程中经常遇到的问题(JSON转JAVA 对象的问题),一直想出一篇关于这方面的文章,总结一下这方面的知识,方便自己以后在遇到类似的问题,能够快速的解决。进入正题。
一、借助 alibaba的fastjson 实现
先附上jar包
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.47</version>
</dependency>
1、常用的静态方法
public static final Object parse(String text); //将Json文本parse为JSONObject或者JSONArray
public static final JSONObject parseObject(String text); //将json文本parse成JSONObject
public static final <T> T parseArray(String text,Class<T> clazz); //把json文本parse为JavaBean
public static final JSONArray parseArray(String text); //把json文本parse成JSONArray
public static final <T> List<T> parseArray(String text,Class<T> clazz); //把json文本parse成JavaBean集合
public static final String toJSONString(Object object); //将JavaBean序列化为带格式的Json文本
public static final Object toJSON(Object javaObject); //将JavaBean转换为JSONObject或者JSONArray-与上述返回值不同
2、具体的用法
(1)json文本 转JsonObject 对象
//一个Json文本数据
String s = "{\"name\":\"hengheng\"}";
// (jsonObject 和 map 类型,是以键值对的形式存在,可以直接使用key值得到 value)
JSONObject object = JSON.parseObject(s);
(2)将Json文本数据转换为JavaBean数据
注:这时候的Json文本信息中的键的名称必须和JavaBean中的字段名称一样!键中没有的在这个JavaBean中就显示为null!
String s = "{\"id\":\"1\",\"cityName\":\"北京\"}";
//一个简单方便 的方法将Json文本信息转换为JsonObject对象的同时转换为JavaBean对象!
City city= JSON.parseObject(s, City.class);//City是是具体的实体类,这里换成你自己的实体类就行啦。
(3)将Map类型的数据转换为JsonString
Map<String,Object> map = new HashMap();
City city = new City(1,"北京");
map.put("城市",city);
String jsonString = JSON.toJSONString(map);
//输出 结果 {"城市":{"cityName":"北京","id":1}}
(4)由一个复杂的Object到Json的例子
//定义一个集合
List<Integer> datas = new ArrayList<>();
datas.add(19);
datas.add(89);
//实体类的属性是一个集合和一个字符串组成
Data data = new Data(datas, "趋势");
String jsonString = JSON.toJSONString(data);
\\ 输出 {"data":[19,89],"name":"趋势"}
(5)JSON文本数据转JSONObject,转换为JSONArray,然后将JSONArray转换为JavaBean
String s = "{js:[{id:\"110000\",\"cityName\":\"北#001京市\"},{id:\"110000\",\"cityName\":\"北#002京市\"}"
+ ",{id:\"110000\",\"cityName\":\"北#002京市\"},{id:\"110000\",\"cityName\":\"北#002京市\"},"
+ "{id:\"110000\",\"cityName\":\"#006北#005京市\"},"
+ "{id:\"110000\",\"cityName\":\"北#002京市\"},"
+ "{id:\"110000\",\"cityName\":\"北#002京市\"},{id:\"120000\",\"cityName\":\"天#009津市\"}]}";
JSONObject object = JSON.parseObject(s);
Object jsonArray = object.get("js");
System.out.println(jsonArray);
List<City> list = JSON.parseArray(jsonArray+"", City.class);
(6)javaBean 转化成 Json 对象
City city= new City("3", "洛阳");
JSONObject json = (JSONObject) JSON.toJSON(city); //JSONObject 是以键值对的形式存在
(7) 将JSON文本转换为JavaBean的集合
原理: 首先转换为JSONArray,然后再转换为List集合
注:获取JSONArray中的数据转换为String类型需要在外边加""
String s = "[{\"id\":\"3\",\"cityName\":\"平顶山\"},{\"id\":\"4\",\"cityName\":\"南阳\"}]";
//将JSON文本转换为JSONArray
JSONArray array = JSON.parseArray(s);
//这行必须写:必须加上+"";不然会报出类型强转异常!
String str = array.get(1)+"";
//转变成具体的实体类
JSONObject object = JSON.parseObject(str);
(8)将JavaBean转换为Json格式的数据/Json文本
City city= new City(1, "上海");
String string = JSON.toJSONString(city);
//输出 {"cityName":"上海","id":1}
(9) 将 Json 转换成 Map
//将json字符串转化成HashMap
HashMap hashMap = JSONObject.parseObject(group, HashMap.class);
//获取 map中的元素,转变成集合
ArrayList component = JSONObject.parseObject(hashMap.get("component") + "", ArrayList.class);
二、下面来看看 fastjson 的底层实现
1、构造方法
private final Map<String, Object> map;
public JSONObject(){
this(DEFAULT_INITIAL_CAPACITY, false);
}
public JSONObject(Map<String, Object> map){
this.map = map;
}
public JSONObject(boolean ordered){
this(DEFAULT_INITIAL_CAPACITY, ordered);
}
public JSONObject(int initialCapacity){
this(initialCapacity, false);
}
public JSONObject(int initialCapacity, boolean ordered){
if (ordered) {
map = new LinkedHashMap<String, Object>(initialCapacity);
} else {
map = new HashMap<String, Object>(initialCapacity);
}
}
当我们使用JSONObject jsonObject = new JSONObject();的时候,他实际上默认的为我们创建了一个HashMap对象来保存对象,使用JSONObject jsonObject = new JSONObject(true)时实际上帮我们创建了一个LinkedHashMap对象,接下来一系列的操作自然也就是使用了Map接口里的相关方法;
三、补充
1、json-lib、jackson、gson、fastjson区别
这里有彩蛋
https://www.jianshu.com/p/75a50aa0cad1
下篇文章分享后端怎么接受前端传过来的参数,为什么经常会有400 的错误或者是后端接受到的参数值是null。以及后端怎么解析前端传过来的Json 字符串。