主流JSON库的Javabean与JSON的互转,以及String类的JSON串解析为JSON对象

参考:https://blog.youkuaiyun.com/suyimin2010/article/details/81406813

https://blog.youkuaiyun.com/DevolperFront/article/details/99515755

Maven依赖:

		<dependency>
			<groupId>net.sf.json-lib</groupId>
			<artifactId>json-lib</artifactId>
			<version>2.4</version>
			<classifier>jdk15</classifier>
		</dependency>

		<!-- https://mvnrepository.com/artifact/com.google.guava/guava -->
		<dependency>
			<groupId>com.google.guava</groupId>
			<artifactId>guava</artifactId>
			<version>20.0</version>
		</dependency>

		<!-- https://mvnrepository.com/artifact/com.google.collections/google-collections -->
		<dependency>
			<groupId>com.google.collections</groupId>
			<artifactId>google-collections</artifactId>
			<version>1.0</version>
		</dependency>

		<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
		<dependency>
			<groupId>org.projectlombok</groupId>
			<artifactId>lombok</artifactId>
			<version>1.16.22</version>
			<scope>provided</scope>
		</dependency>

		<!-- https://mvnrepository.com/artifact/com.google.code.gson/gson -->
		<dependency>
			<groupId>com.google.code.gson</groupId>
			<artifactId>gson</artifactId>
			<version>2.8.5</version>
		</dependency>

		<!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
		<dependency>
			<groupId>com.alibaba</groupId>
			<artifactId>fastjson</artifactId>
			<version>1.2.50</version>
		</dependency>

		<!-- https://mvnrepository.com/artifact/net.minidev/json-smart -->
		<dependency>
			<groupId>net.minidev</groupId>
			<artifactId>json-smart</artifactId>
			<version>2.3</version>
		</dependency>

		<!-- https://mvnrepository.com/artifact/org.json/json -->
		<dependency>
			<groupId>org.json</groupId>
			<artifactId>json</artifactId>
			<version>20190722</version>
		</dependency>

		<!-- https://mvnrepository.com/artifact/com.googlecode.json-simple/json-simple -->
		<dependency>
			<groupId>com.googlecode.json-simple</groupId>
			<artifactId>json-simple</artifactId>
			<version>1.1.1</version>
		</dependency>

		<dependency>
			<groupId>com.fasterxml.jackson.core</groupId>
			<artifactId>jackson-databind</artifactId>
			<version>2.9.8</version>
		</dependency>
		
		<dependency>
			<groupId>com.fasterxml.jackson.core</groupId>
			<artifactId>jackson-annotations</artifactId>
			<version>2.9.0</version>
		</dependency>

准备工作:

package cn.cuit.testa0;


import lombok.Data;


@Data
public class FullName
{
    private String firstName;

    private String middleName;

    private String lastName;

    public FullName()
    {}

    public FullName(String firstName, String middleName, String lastName)
    {
        this.firstName = firstName;
        this.middleName = middleName;
        this.lastName = lastName;
    }

    @Override
    public String toString()
    {
        return "[firstName=" + firstName + ", middleName=" + middleName + ", lastName=" + lastName + "]";
    }
}
package cn.cuit.testa0;


import java.util.Date;
import java.util.List;
import java.util.Map;

import lombok.Data;


@Data
public class Person
{
    private String name;

    private FullName fullName;

    private int age;

    private Date birthday;

    private List<String> hobbies;

    private Map<String, String> clothes;

    private List<Person> friends;

    @Override
    public String toString()
    {
        StringBuilder str = new StringBuilder(
            "Person [name=" + name + ", fullName=" + fullName + ", age=" + age + ", birthday=" + birthday + ", hobbies=" + hobbies + ", clothes=" + clothes + "]\n");
        if (friends != null)
        {
            str.append("Friends:\n");
            for (Person f : friends)
            {
                str.append("\t").append(f);
            }
        }
        return str.toString();
    }
}
package cn.cuit.testa0;


import com.alibaba.fastjson.JSON;


public class FastJsonUtil
{
    public static String bean2Json(Object obj)
    {
        return JSON.toJSONString(obj);
    }

    public static <T> T json2Bean(String jsonStr, Class<T> objClass)
    {
        return JSON.parseObject(jsonStr, objClass);
    }
}
package cn.cuit.testa0;


import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonElement;
import com.google.gson.JsonParser;


public class GsonUtil
{
    // Gson gson = new Gson(); 两种创建方式
    private static Gson gson = new GsonBuilder().create();

    public static String bean2Json(Object obj)
    {
        return gson.toJson(obj);
    }

    public static <T> T json2Bean(String jsonStr, Class<T> objClass)
    {
        return gson.fromJson(jsonStr, objClass);
    }

    public static String jsonFormatter(String uglyJsonStr)
    {
        Gson gson = new GsonBuilder().setPrettyPrinting().create();
        JsonParser jp = new JsonParser();
        JsonElement je = jp.parse(uglyJsonStr);
        return gson.toJson(je);
    }
}
package cn.cuit.testa0;


import java.io.IOException;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;


public class JacksonUtil
{
    private static ObjectMapper mapper = new ObjectMapper();

    public static String bean2Json(Object obj)
    {
        try
        {
            return mapper.writeValueAsString(obj);
        }
        catch (JsonProcessingException e)
        {
            e.printStackTrace();
            return null;
        }
    }

    public static <T> T json2Bean(String jsonStr, Class<T> objClass)
    {
        try
        {
            return mapper.readValue(jsonStr, objClass);
        }
        catch (IOException e)
        {
            e.printStackTrace();
            return null;
        }
    }
}
package cn.cuit.testa0;


import net.sf.json.JSONObject;


public class JsonLibUtil
{

    public static String bean2Json(Object obj)
    {
        JSONObject jsonObject = JSONObject.fromObject(obj);
        return jsonObject.toString();
    }

    @SuppressWarnings("unchecked")
    public static <T> T json2Bean(String jsonStr, Class<T> objClass)
    {
        return (T)JSONObject.toBean(JSONObject.fromObject(jsonStr), objClass);
    }
}
package cn.cuit.testa0;


import net.minidev.json.JSONValue;


public class JsonSmartUtil
{
    public static String bean2Json(Object obj)
    {
        return JSONValue.toJSONString(obj);
    }

    public static <T> T json2Bean(String jsonStr, Class<T> objClass)
    {
        return JSONValue.parse(jsonStr, objClass);
    }
}

测试代码:

package cn.cuit.testa0;


import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.json.simple.parser.JSONParser;
import org.json.simple.parser.ParseException;
import org.junit.Before;
import org.junit.Test;

import com.alibaba.fastjson.JSON;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.google.common.collect.Maps;
import com.google.gson.JsonArray;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;

import net.minidev.json.JSONValue;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;


/**
  * @ClassName: TestJson
  * @Description: 所有主流JSON库的对象转JSON和JSON转对象,以及String类的JSON串解析为JSON对象
  * @lib: 
  *     json-lib-2.4-jdk15【性能较差,用法还可以】
  *     fastjson
  *     json-smart
  *     org.json【对JavaBean与JSON之前的互转支持差】
  *     json-simple【不太好用,与其他库用法有所差异,主要用于Map的支持,对JavaBean几乎不支持】
  *     Gson
  *     Jackson
  * @author CUITLLB
  * @date Sep 24, 2019 12:06:39 PM
  * @Copyright: Copyright (c) 2018 
  * @Company:IBM
  * 
  * @JSON 库性能参考:https://blog.youkuaiyun.com/DevolperFront/article/details/99515755
  */

public class TestJson
{
    
    // 用的时候注意判断获取到的是否为null,否则易产生空指针异常,这里没有做校验
    
    // 需要解析的字符串
    String jsonString = "{\n" + 
        "    \"status\": 0,\n" + 
        "    \"message\": \"Everything is ok.\",\n" + 
        "    \"result\": {\n" + 
        "        \"total_count\": 1,\n" + 
        "        \"users\": [\n" + 
        "            {\n" + 
        "                \"user_id\": \"a017c149c08e35acd968598944\",\n" + 
        "                \"domain_id\": \"hcxm\",\n" + 
        "                \"status\": \"ACTIVATED\",\n" + 
        "                \"state\": \"NORMAL\",\n" + 
        "                \"username\": \"uf085268\",\n" + 
        "                \"name\": \"Li Linbo, BBF-421(IBM Simba)\",\n" + 
        "                \"pinyin\": \"Li Linbo, BBF-421(IBM Simba)\",\n" + 
        "                \"initial\": \"Li Linbo, BBF-421(IBM Simba)\",\n" + 
        "                \"nickname\": \"Li Linbo, BBF-421(IBM Simba)\",\n" + 
        "                \"phone\": \"\",\n" + 
        "                \"email\": \"\",\n" + 
        "                \"gender\": \"UNKNOWN\",\n" + 
        "                \"disabled\": false,\n" + 
        "                \"initial_password\": true,\n" + 
        "                \"agreement_confirmed\": false,\n" + 
        "                \"biological_auth_enabled\": false,\n" + 
        "                \"source_type\": \"LDAP\"\n" + 
        "            }\n" + 
        "        ]\n" + 
        "    }\n" + 
        "}";
    
    private Person person;
    
    @Before
    public void prepare() {
        List<Person> friends = new ArrayList<Person>();
        friends.add(this.createAPerson("Judiy", null));
        friends.add(this.createAPerson("Tony", null));
        friends.add(this.createAPerson("Mark", null));
        person = createAPerson("Li Linbo", friends);
    }
    
    private Person createAPerson(String name, List<Person> friends) {
        Person newPerson=new Person();
        newPerson.setName(name);
        newPerson.setFullName(new FullName("Li_first", "Lin_middle", "bo_last"));
        newPerson.setAge(24);
        List<String> hobbies=new ArrayList<String>();
        hobbies.add("music");
        hobbies.add("swing");
        hobbies.add("coding");
        newPerson.setHobbies(hobbies);
        Map<String,String> clothes=new HashMap<String, String>();
        clothes.put("coat", "Nike");
        clothes.put("trousers", "Onitsuka Tiger");
        clothes.put("shoes", "AJ");
        newPerson.setClothes(clothes);
        newPerson.setFriends(friends);
        return newPerson;
    }
    
    public static void main(String[] args)
    {
    }
    
    // Json-lib 4 String
    @Test
    public void testJsonLib4String() {
        JSONObject fromObject = JSONObject.fromObject(jsonString);
        System.out.println(fromObject);

        JSONObject object = (JSONObject)fromObject.get("result");
        System.out.println(object);

        JSONArray jsonArray = object.getJSONArray("users");
        System.out.println(jsonArray);

        object = (JSONObject)jsonArray.get(0);
        System.out.println(object);
        
        System.out.println(object.get("username"));
    }
    
    // Json-lib 4 Object
    @Test
    public void testJsonLib4Object() {
        // Object -> String
        String bean2Json = JsonLibUtil.bean2Json(person);
        System.out.println(bean2Json);
        
        // String -> Object
        Person json2Bean = JsonLibUtil.json2Bean(bean2Json, Person.class);
        // 直接输出对象会报异常, 解析出来后,里面的friends属性是一个MorphDynaBean包装Bean,
        // Person中直接遍历的时候直接转为Person就报类型转换异常,参考:https://www.cnblogs.com/longshiyVip/p/4608098.html
        System.out.println(json2Bean.getFriends().get(0));
        //System.out.println(json2Bean.getFriends().get(0).getAge()); // 报错
        System.out.println(json2Bean.getAge());
        
        // 上述问题的解决方法
        Map<String, Class<?>> classMap = Maps.newHashMap();
        classMap.put("friends", Person.class);
        // 需要注意的一点是,这里第一个参数不是String而是一个JsonObject
        Person bean = (Person)JSONObject.toBean(JSONObject.fromObject(bean2Json), Person.class, classMap);
        System.out.println(bean);
        System.out.println(bean.getFriends().get(0).getAge());
    }
    
    // fastjson 4 String
    @Test
    public void testFastJson4String() {
        com.alibaba.fastjson.JSONObject parseObject = JSON.parseObject(jsonString);
        System.out.println(parseObject);
        
        com.alibaba.fastjson.JSONObject jsonObject = parseObject.getJSONObject("result");
        System.out.println(jsonObject);
        
        com.alibaba.fastjson.JSONArray jsonArray = jsonObject.getJSONArray("users");
        com.alibaba.fastjson.JSONObject object = (com.alibaba.fastjson.JSONObject)jsonArray.get(0);
        System.out.println(object);
        
        System.out.println(object.get("username"));
    }
    
    // fastjson 4 Object
    @Test
    public void testFastJson4Object() {
        // Object -> String
        String bean2Json = FastJsonUtil.bean2Json(person);
        System.out.println(bean2Json);
        
        // String -> Object
        Person json2Bean = FastJsonUtil.json2Bean(bean2Json, Person.class);
        System.out.println(json2Bean);
    }
    
    // json-smart 4 String
    @Test
    public void testJsonSmart4String() {
        net.minidev.json.JSONObject jsonObject = (net.minidev.json.JSONObject)JSONValue.parse(jsonString);
        System.out.println(jsonObject);
        
        net.minidev.json.JSONObject object = (net.minidev.json.JSONObject)jsonObject.get("result");
        System.out.println(object);
        
        net.minidev.json.JSONArray jsonArray = (net.minidev.json.JSONArray)object.get("users");
        System.out.println(jsonArray);
        
        object =  (net.minidev.json.JSONObject)jsonArray.get(0);
        System.out.println(object);
        
        System.out.println(object.get("username"));
    }
    
    // json-smart 4 Object
    @Test
    public void testJsonSmart4Object() {
        // Object -> String
        String bean2Json = JsonSmartUtil.bean2Json(person);
        System.out.println(bean2Json);
        
        // String -> Object
        Person json2Bean = JsonSmartUtil.json2Bean(bean2Json, Person.class);
        System.out.println(json2Bean);
    }
    
    // org.json 4 String
    @Test
    public void testOrgJson4String() {
        org.json.JSONObject jsonObject = new org.json.JSONObject(jsonString);
        System.out.println(jsonObject);
        
        org.json.JSONObject  object = (org.json.JSONObject)jsonObject.get("result");
        System.out.println(object);
        
        org.json.JSONArray jsonArray = (org.json.JSONArray)object.get("users");
        System.out.println(jsonArray);
        
        object = (org.json.JSONObject)jsonArray.get(0);
        System.out.println(object.get("username"));
    }
    
    // org.json默认不支持将JsonObject转为Java对象,需要自己增强
    @Test
    public void testOrgJson4Object() {
        // Object -> String
        String bean2Json = new CuitJSONObject(jsonString).toString();
        System.out.println(bean2Json);
        
        // String -> Object // 有问题
        person = (Person) new CuitJSONObject(bean2Json).toJavaBean(Person.class);
        System.out.println(person);
    }
    
    // json-simple 4 String
    @Test
    public void testJsonSimple4String() throws ParseException {
        JSONParser jsonParser = new JSONParser();
        org.json.simple.JSONObject  jsonObject = (org.json.simple.JSONObject)jsonParser.parse(jsonString);
        System.out.println(jsonObject);
        
        jsonObject = (org.json.simple.JSONObject)jsonObject.get("result");
        System.out.println(jsonObject);
        
        org.json.simple.JSONArray jsonArray = (org.json.simple.JSONArray)jsonObject.get("users");
        System.out.println(jsonArray);
        
        jsonObject = (org.json.simple.JSONObject)jsonArray.get(0);
        System.out.println(jsonObject.get("username"));
    }
    
    // Gson 4 String 
    @Test
    public void testGson4String() {
        // 格式化Json
        System.out.println(GsonUtil.jsonFormatter(jsonString));
        
        JsonParser jsonParser = new JsonParser();
        JsonObject jsonObject = (JsonObject)jsonParser.parse(jsonString);
        System.out.println(jsonObject);
        
        jsonObject = (JsonObject)jsonObject.get("result");
        System.out.println(jsonObject);
        
        JsonArray jsonArray =  (JsonArray)jsonObject.get("users");
        System.out.println(jsonArray);
        jsonObject = (JsonObject)jsonArray.get(0);
        
        // 最终输出的还是带有""包裹
        System.out.println(jsonObject.get("username"));
    }
    
    // Gson 4 Object 
    @Test
    public void testGson4Object() {
        // Object -> String
        String bean2Json = GsonUtil.bean2Json(person);
        System.out.println(bean2Json);
        
        // String -> Object
        person = GsonUtil.json2Bean(bean2Json, Person.class);
        System.out.println(person);
    }
    
    // Jackson 4 String
    @Test
    public void testJackson4String() throws IOException {
        ObjectMapper objectMapper = new ObjectMapper();
        
        // 方式一
        JsonNode rootNode = objectMapper.readTree(jsonString);
        System.out.println(rootNode);
        
        JsonNode resultPath = rootNode.path("result");
        System.out.println(resultPath);
        
        JsonNode usersPath = resultPath.path("users");
        System.out.println(usersPath);
        
        JsonNode userJsonNode = usersPath.get(0);
        System.out.println(userJsonNode);
        // 最终输出的还是带有""包裹
        System.out.println(userJsonNode.get("username"));
        
        // 方式二
        JsonNode resultJsonNode = rootNode.get("result");
        System.out.println(resultJsonNode);
        
        JsonNode usersJsonNode = resultJsonNode.get("users");
        System.out.println(usersJsonNode);
        
        JsonNode userNode = usersJsonNode.get(0);
        System.out.println(userNode.get("username"));
        
        // 返回""
        String result1 = resultJsonNode != null ? resultJsonNode.asText() : "";
        // 返回值
        String result2 = resultJsonNode != null ? resultJsonNode.toString() : "";
        System.out.println(result1);
        System.out.println(result2);
    }
    
    // Jackson 4 Object
    @Test
    public void testJackson4Object() {
        String bean2Json = JacksonUtil.bean2Json(person);
        System.out.println(bean2Json);
        
        person = JacksonUtil.json2Bean(bean2Json, Person.class);
        System.out.println(person);
    }
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值