Java和Json的那些事
一、Java简介
Java是一种广泛使用的编程语言,常用于开发各种类型的应用程序,包括桌面应用程序、移动应用程序和Web应用程序。Java是一种面向对象的语言,具有丰富的类库和强大的功能,可以进行多线程编程、网络编程和安全编程等。
二、Json简介
JSON是一种轻量级的数据交换格式,用于表示简单的数据结构和对象。JSON的数据格式非常简单,易于理解和编写,并且广泛应用于Web应用程序和移动应用程序等领域。在Java中,可以使用第三方库来解析和生成JSON数据,例如GSON和Jackson等库。
三、两者关系
在Java中,可以使用各种库和框架来处理JSON数据,例如JSON库、GSON库、Jackson库等。这些库提供了各种功能,包括将Java对象转换为JSON格式,将JSON格式转换为Java对象,以及处理JSON数组和嵌套JSON等。使用这些库可以使Java开发人员更轻松地处理JSON数据。
四、Java中常用处理JSON数据的API
- org.json:这是Java SE 7及更高版本中提供的官方JSON处理API。它提供了JSONObject和JSONArray等类来解析和生成JSON数据。但是这个库已经很久没有更新,且在处理大量数据时性能较差,因此并不推荐使用。
- Gson:由Google提供的开源JSON处理库。Gson可以将Java对象转换为JSON格式,也可以将JSON格式转换为Java对象。Gson使用起来非常简单,而且具有良好的性能。它可以处理复杂的嵌套JSON结构,并且支持自定义的序列化和反序列化规则。
- Jackson:又称Jackson JSON Processor,是由FasterXML提供的一个开源的高性能JSON处理库。Jackson提供了三个主要的模块:Jackson Core、Jackson Databind和Jackson Annotations。Jackson Core提供了JSON解析和生成的基本API,Jackson Databind用于将Java对象映射到JSON格式,Jackson Annotations用于定义JSON的序列化和反序列化规则。
- JSON-lib:一个比较老的开源JSON处理库,已经不再维护。它提供了一些类来解析和生成JSON数据,但是使用起来比较复杂,而且性能不如Gson和Jackson。
以上是Java中常用的处理JSON数据的API,其中Gson和Jackson是目前比较流行和常用的两个库
五、常用类
常用的处理JSON数据的类取决于你选择使用哪个库。以下是几个流行的JSON处理库以及其常用的类:
- org.json:
- JSONObject:用于表示JSON对象。
- JSONArray:用于表示JSON数组。
- JSONTokener:用于解析JSON字符串并生成相应的JSONObject或JSONArray对象。
- Gson:
- Gson:主要的类,用于将Java对象转换为JSON格式,以及将JSON格式转换为Java对象。
- JsonParser:用于解析JSON字符串并生成JsonElement对象。
- JsonElement:表示JSON元素的抽象类,包括JsonObject、JsonArray、JsonPrimitive和JsonNull。
- Jackson:
- ObjectMapper:主要的类,用于将Java对象转换为JSON格式,以及将JSON格式转换为Java对象。
- JsonParser:用于解析JSON字符串并生成JsonNode对象。
- JsonNode:表示JSON节点的抽象类,包括JsonArray、JsonObject、JsonNumber、JsonString和JsonBoolean。
以上是常用的JSON处理库和类。使用不同的库和类,可以根据自己的需求选择最合适的方式处理JSON数据。
六、使用案例
- 基于org.json
import org.json.*;
public class JsonOrgExample {
public static void main(String[] args) throws JSONException {
String jsonString = "{\"name\":\"John\", \"age\":30, \"city\":\"New York\"}";
JSONObject jsonObject = new JSONObject(jsonString);
String name = jsonObject.getString("name");
int age = jsonObject.getInt("age");
String city = jsonObject.getString("city");
System.out.println("Name: " + name);
System.out.println("Age: " + age);
System.out.println("City: " + city);
}
}
----------------------------------------------------------------------
import org.json.*;
public class JsonOrgExample {
public static void main(String[] args) throws JSONException {
String jsonString = "{\n" +
" \"name\": \"John\",\n" +
" \"age\": 30,\n" +
" \"address\": {\n" +
" \"street\": \"123 Main St\",\n" +
" \"city\": \"New York\",\n" +
" \"state\": \"NY\",\n" +
" \"zip\": \"10001\"\n" +
" },\n" +
" \"phoneNumbers\": [\n" +
" {\n" +
" \"type\": \"home\",\n" +
" \"number\": \"555-1234\"\n" +
" },\n" +
" {\n" +
" \"type\": \"work\",\n" +
" \"number\": \"555-5678\"\n" +
" }\n" +
" ],\n" +
" \"emails\": [\n" +
" \"john@example.com\",\n" +
" \"john.doe@example.com\"\n" +
" ]\n" +
"}";
JSONObject jsonObject = new JSONObject(jsonString);
String name = jsonObject.getString("name");
int age = jsonObject.getInt("age");
JSONObject addressObject = jsonObject.getJSONObject("address");
String street = addressObject.getString("street");
String city = addressObject.getString("city");
String state = addressObject.getString("state");
String zip = addressObject.getString("zip");
JSONArray phoneNumbersArray = jsonObject.getJSONArray("phoneNumbers");
String homePhoneNumber = phoneNumbersArray.getJSONObject(0).getString("number");
String workPhoneNumber = phoneNumbersArray.getJSONObject(1).getString("number");
JSONArray emailsArray = jsonObject.getJSONArray("emails");
String email1 = emailsArray.getString(0);
String email2 = emailsArray.getString(1);
System.out.println("Name: " + name);
System.out.println("Age: " + age);
System.out.println("Street: " + street);
System.out.println("City: " + city);
System.out.println("State: " + state);
System.out.println("Zip: " + zip);
System.out.println("Home phone number: " + homePhoneNumber);
System.out.println("Work phone number: " + workPhoneNumber);
System.out.println("Email 1: " + email1);
System.out.println("Email 2: " + email2);
}
}
- Gson
import com.google.gson.*;
public class GsonExample {
public static void main(String[] args) {
String jsonString = "{\"name\":\"John\", \"age\":30, \"city\":\"New York\"}";
Gson gson = new Gson();
Person person = gson.fromJson(jsonString, Person.class);
System.out.println("Name: " + person.getName());
System.out.println("Age: " + person.getAge());
System.out.println("City: " + person.getCity());
}
}
class Person {
private String name;
private int age;
private String city;
// getters and setters
}
----------------------------------------------------------------------
import com.google.gson.*;
public class GsonExample {
public static void main(String[] args) {
String jsonString = "{\n" +
" \"name\": \"John\",\n" +
" \"age\": 30,\n" +
" \"address\": {\n" +
" \"street\": \"123 Main St\",\n" +
" \"city\": \"New York\",\n" +
" \"state\": \"NY\",\n" +
" \"zip\": \"10001\"\n" +
" },\n" +
" \"phoneNumbers\": [\n" +
" {\n" +
" \"type\": \"home\",\n" +
" \"number\": \"555-1234\"\n" +
" },\n" +
" {\n" +
" \"type\": \"work\",\n" +
" \"number\": \"555-5678\"\n" +
" }\n" +
" ],\n" +
" \"emails\": [\n" +
" \"john@example.com\",\n" +
" \"john.doe@example.com\"\n" +
" ]\n" +
"}";
Gson gson = new Gson();
Person person = gson.fromJson(jsonString, Person.class);
System.out.println("Name: " + person.getName());
System.out.println("Age: " + person.getAge());
System.out.println("Street: " + person.getAddress().getStreet());
System.out.println("City: " + person.getAddress().getCity());
System.out.println("State: " + person.getAddress().getState());
System.out.println("Zip: " + person.getAddress().getZip());
System.out.println("Home phone number: " + person.getPhoneNumbers().get(0).getNumber());
System.out.println("Work phone number: " + person.getPhoneNumbers().get(1).getNumber());
System.out.println("Email 1: " + person.getEmails().get(0));
System.out.println("Email 2: " + person.getEmails().get(1));
}
}
class Person {
private String name;
private int age;
private Address address;
private List<PhoneNumber> phoneNumbers;
private List<String> emails;
// getters and setters
}
class Address {
private String street;
private String city;
private String state;
private String zip;
// getters and setters
}
class PhoneNumber {
private String type;
private String number;
// getters and setters
}
- Jackson
import com.fasterxml.jackson.databind.*;
public class JacksonExample {
public static void main(String[] args) throws JsonProcessingException {
String jsonString = "{\"name\":\"John\", \"age\":30, \"city\":\"New York\"}";
ObjectMapper objectMapper = new ObjectMapper();
Person person = objectMapper.readValue(jsonString, Person.class);
System.out.println("Name: " + person.getName());
System.out.println("Age: " + person.getAge());
System.out.println("City: " + person.getCity());
}
}
class Person {
private String name;
private int age;
private String city;
// getters and setters
}
----------------------------------------------------------------------
import com.fasterxml.jackson.databind.*;
public class JacksonExample {
public static void main(String[] args) throws JsonProcessingException {
String jsonString = "{\n" +
" \"name\": \"John\",\n" +
" \"age\": 30,\n" +
" \"address\": {\n" +
" \"street\": \"123 Main St\",\n" +
" \"city\": \"New York\",\n" +
" \"state\": \"NY\",\n" +
" \"zip\": \"10001\"\n" +
" },\n" +
" \"phoneNumbers\": [\n" +
" {\n" +
" \"type\": \"home\",\n" +
" \"number\": \"555-1234\"\n" +
" },\n" +
" {\n" +
" \"type\": \"work\",\n" +
" \"number\": \"555-5678\"\n" +
" }\n" +
" ],\n" +
" \"emails\": [\n" +
" \"john@example.com\",\n" +
" \"john.doe@example.com\"\n" +
" ]\n" +
"}";
ObjectMapper objectMapper = new ObjectMapper();
Person person = objectMapper.readValue(jsonString, Person.class);
System.out.println("Name: " + person.getName());
System.out.println("Age: " + person.getAge());
System.out.println("Street: " + person.getAddress().getStreet());
System.out.println("City: " + person.getAddress().getCity());
System.out.println("State: " + person.getAddress().getState());
System.out.println("Zip: " + person.getAddress().getZip());
System.out.println("Home phone number: " + person.getPhoneNumbers().get(0).getNumber());
System.out.println("Work phone number: " + person.getPhoneNumbers().get(1).getNumber());
System.out.println("Email 1: " + person.getEmails().get(0));
System.out.println("Email 2: " + person.getEmails().get(1));
}
}
class Person {
private String name;
private int age;
private Address address;
private List<PhoneNumber> phoneNumbers;
private List<String> emails;
// getters and setters
}
class Address {
private String street;
private String city;
private String state;
private String zip;
// getters and setters
}
class PhoneNumber {
private String type;
private String number;
// getters and setters
}
七、gson和jackson区别
Gson和Jackson都是在Java中处理JSON数据的库,它们都有自己的优点和适用场景。
以下是Gson和Jackson的主要区别:
- 性能:Gson通常比Jackson更快,因为它专注于将Java对象转换为JSON格式,而不是JSON格式转换为Java对象。但是,这种性能优势在处理大型数据集时可能会减少,因为Jackson在处理大型JSON数据集时更有效率。
- 易用性:Gson通常被认为比Jackson更易用,因为它提供了更简单的API和更少的配置选项。但是,Jackson提供了更多的配置选项,使其更灵活,并且它的功能更强大。
- 对象映射:Gson支持自定义对象映射规则,这使得它在处理复杂的Java对象时非常方便。而Jackson默认情况下采用JavaBean规范进行对象映射,这可能需要一些额外的配置来实现自定义对象映射。
- 处理嵌套JSON:Jackson通常比Gson更适合处理嵌套的JSON数据,因为Jackson支持将JSON解析为一个树状结构,这使得处理嵌套的JSON数据变得更容易。
总之,Gson和Jackson都是非常流行和强大的JSON处理库,它们都有自己的优点和缺点,可以根据实际需求来选择使用哪一个。
八、jackson中的jsonnode
在Jackson中,将JSON解析为一个树状结构可以使用JsonNode类,这个类可以表示JSON数据的任何部分,包括对象、数组、字符串、数字等。JsonNode类提供了许多方法来访问和操作JSON数据,这使得处理嵌套的JSON数据变得更容易。
JsonNode类的一些常用API:
- get(String fieldName):获取指定名称的JSON属性,返回JsonNode对象。
- get(int index):获取数组的指定元素,返回JsonNode对象。
- asText():将JSON节点转换为字符串。
- asInt():将JSON节点转换为整数。
- asBoolean():将JSON节点转换为布尔值。
- has(String fieldName):检查是否存在指定名称的JSON属性。
- isArray():检查该节点是否为数组。
- isObject():检查该节点是否为对象。
- size():获取该节点的大小(对于数组是元素个数,对于对象是属性个数)。
import com.fasterxml.jackson.databind.*;
public class JsonNodeExample {
public static void main(String[] args) throws JsonProcessingException {
String jsonString = "{\n" +
" \"name\": \"John\",\n" +
" \"age\": 30,\n" +
" \"address\": {\n" +
" \"street\": \"123 Main St\",\n" +
" \"city\": \"New York\",\n" +
" \"state\": \"NY\",\n" +
" \"zip\": \"10001\"\n" +
" },\n" +
" \"phoneNumbers\": [\n" +
" {\n" +
" \"type\": \"home\",\n" +
" \"number\": \"555-1234\"\n" +
" },\n" +
" {\n" +
" \"type\": \"work\",\n" +
" \"number\": \"555-5678\"\n" +
" }\n" +
" ],\n" +
" \"emails\": [\n" +
" \"john@example.com\",\n" +
" \"john.doe@example.com\"\n" +
" ]\n" +
"}";
ObjectMapper objectMapper = new ObjectMapper();
JsonNode rootNode = objectMapper.readTree(jsonString);
JsonNode nameNode = rootNode.get("name");
String name = nameNode.asText();
System.out.println("Name: " + name);
JsonNode ageNode = rootNode.get("age");
int age = ageNode.asInt();
System.out.println("Age: " + age);
JsonNode addressNode = rootNode.get("address");
String street = addressNode.get("street").asText();
System.out.println("Street: " + street);
String city = addressNode.get("city").asText();
System.out.println("City: " + city);
String state = addressNode.get("state").asText();
System.out.println("State: " + state);
String zip = addressNode.get("zip").asText();
System.out.println("Zip: " + zip);
JsonNode phoneNumbersNode = rootNode.get("phoneNumbers");
boolean isPhoneNumbersArray = phoneNumbersNode.isArray();
System.out.println("Is phoneNumbers an array? " + isPhoneNumbersArray);
int phoneNumbersSize = phoneNumbersNode.size();
System.out.println("Phone numbers size: " + phoneNumbersSize);
JsonNode firstPhoneNumberNode = phoneNumbersNode.get(0);
String homePhoneNumber = firstPhoneNumberNode.get("number").asText();
System.out.println("Home phone number: " + homePhoneNumber);
JsonNode emailsNode = rootNode.get("emails");
boolean isEmailsArray = emailsNode.isArray();
System.out.println("Is emails an array? " + isEmailsArray);
int emailsSize = emailsNode.size();
System.out.println("Emails size: " + emailsSize);
String email1 = emailsNode.get(0).asText();
System.out.println("Email 1: " + email1);
String email2 = emailsNode.get(1).asText();
System.out.println("Email 2: " + email2);
}
}
九、fastJson
Fastjson是一个Java语言的高性能JSON处理库,由阿里巴巴公司开源发布。它提供了一组简单而强大的API来处理JSON数据,能够实现快速的JSON序列化和反序列化,支持Java对象和JSON数据之间的互相转换。
Fastjson还提供了许多高级功能,例如支持自定义序列化和反序列化规则、支持Java泛型和循环引用、支持JSON和JavaBean之间的深度转换等。由于其高性能和强大的功能,Fastjson在许多Java应用程序中被广泛使用。
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
public class Main {
public static void main(String[] args) {
String jsonString = "{\"name\":\"Tom\",\"age\":20,\"address\":{\"street\":\"123 Main St\",\"city\":\"New York\",\"state\":\"NY\"},\"phoneNumbers\":[{\"type\":\"home\",\"number\":\"123-456-7890\"},{\"type\":\"work\",\"number\":\"111-222-3333\"}]}";
// 将JSON字符串解析为JSONObject对象
JSONObject jsonObj = JSON.parseObject(jsonString);
// 从JSONObject中获取属性值
String name = jsonObj.getString("name");
int age = jsonObj.getIntValue("age");
JSONObject address = jsonObj.getJSONObject("address");
String street = address.getString("street");
String city = address.getString("city");
String state = address.getString("state");
JSONArray phoneNumbers = jsonObj.getJSONArray("phoneNumbers");
for (int i = 0; i < phoneNumbers.size(); i++) {
JSONObject phone = phoneNumbers.getJSONObject(i);
String type = phone.getString("type");
String number = phone.getString("number");
System.out.println(type + ": " + number);
}
}
}
Fastjson提供了丰富的API,以下是其中一些常用的API:
JSON.parseObject(String text, Class<T> clazz)
:将JSON字符串解析为Java对象,第一个参数是要解析的JSON字符串,第二个参数是要转换的Java类。JSON.toJSONString(Object object)
:将Java对象转换为JSON字符串。JSONObject
:Fastjson提供了一个JSONObject类来表示JSON对象,它可以像Java Map一样存储和获取属性。JSONArray
:Fastjson提供了一个JSONArray类来表示JSON数组,它可以像Java List一样存储和获取元素。JSON.parseArray(String text, Class<T> clazz)
:将JSON字符串解析为Java List。JSON.parseObject(String text)
:将JSON字符串解析为JSONObject对象。JSON.parse(String text)
:将JSON字符串解析为Java对象,返回值类型为Object。JSONValidator
:Fastjson提供了一个JSONValidator类,用于验证JSON字符串的合法性。JSONPath
:Fastjson提供了一个JSONPath类,用于从JSON对象或JSON字符串中提取数据。SerializerFeature
:Fastjson提供了一个SerializerFeature枚举类,用于设置序列化特性,例如禁止循环引用检测、格式化输出等。
以上是Fastjson一些常用的API,你可以根据具体需求选择使用。