最近一直忙着做毕设,好长时间没写博客了,正好今天有时间,写一篇实习过程中经常遇到的问题(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 字符串。