参考: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);
}
}