Java JSON 示例

欢迎来到 Java JSON 示例教程. ** JSON** (JavaScript Object Notation) 是基于文本的轻量级技术,用于生成人体可读的格式化数据. JSON 代表对象数据以关键值对的形式。

Java JSON 编辑

java json, java json parser, java json example, javax.json, JsonReader, JsonWriter, JsonParser, JsonGenerator JSON is widely used in web applications or as server response because it's lightweight and more compact than XML. JSON objects are easy to read and write and most of the technologies provide support for JSON objects. That's why JSON in Java web services are very popular. JSR353 finally made into Java EE 7 and it's the Java JSON processing API. jsonp is the reference implementation for Java JSON Processing API. We can use this in maven project by adding following dependency.

1<dependency>
2    <groupId>org.glassfish</groupId>
3    <artifactId>javax.json</artifactId>
4    <version>1.0.2</version>
5</dependency>

如果您正在使用 GlassFish 4.0,那么您可以按提供的方式保持范围,因为它已经包含在服务器中。

  1. 对象模型 API - 类似于 DOM Parser并且适用于小型对象
  2. 流式 API - 类似于 StaX Parser并且适用于不希望存储整个对象的大型对象

Java JSON API 的一些重要界面是:

我们可以从Json类或JsonReaderFactory 2. javax.json.JsonWriter:我们可以使用这个来读JSON对象到输出流 3. **javax.json.stream_3. javax.json.stream_5.json.stream_5.json.JsonParser: 这是一个引导分析器和提供流媒体支持读JSON对象 4. javax.json.stream.JsonGenerator:我们可以使用这个来写JSON对象到输出流( _3)。 javax.json.stream_5.jsonParser:这是制作JSON处理对象的工厂类。

让我们来看看使用Java JSON API的简单程序,我们有一个JSON对象存储在 employee.txt文件中。

 1{
 2    "id":123,
 3    "name":"Pankaj Kumar",
 4    "permanent":true,
 5    "address":{
 6    		"street":"El Camino Real",
 7    		"city":"San Jose",
 8    		"zipcode":95014
 9    	},
10    "phoneNumbers":[9988664422, 1234567890],
11    "role":"Developer"
12}

我们有 java bean 类,代表 JSON 格式如下:

 1package com.journaldev.model;
 2
 3import java.util.Arrays;
 4
 5public class Employee {
 6
 7    private int id;
 8    private String name;
 9    private boolean permanent;
10    private Address address;
11    private long[] phoneNumbers;
12    private String role;
13    
14    public int getId() {
15    	return id;
16    }
17    public void setId(int id) {
18    	this.id = id;
19    }
20    public String getName() {
21    	return name;
22    }
23    public void setName(String name) {
24    	this.name = name;
25    }
26    public boolean isPermanent() {
27    	return permanent;
28    }
29    public void setPermanent(boolean permanent) {
30    	this.permanent = permanent;
31    }
32    public Address getAddress() {
33    	return address;
34    }
35    public void setAddress(Address address) {
36    	this.address = address;
37    }
38    public long[] getPhoneNumbers() {
39    	return phoneNumbers;
40    }
41    public void setPhoneNumbers(long[] phoneNumbers) {
42    	this.phoneNumbers = phoneNumbers;
43    }
44    public String getRole() {
45    	return role;
46    }
47    public void setRole(String role) {
48    	this.role = role;
49    }
50    
51    @Override
52    public String toString(){
53    	StringBuilder sb = new StringBuilder();
54    	sb.append("***** Employee Details *****\n");
55    	sb.append("ID="+getId()+"\n");
56    	sb.append("Name="+getName()+"\n");
57    	sb.append("Permanent="+isPermanent()+"\n");
58    	sb.append("Role="+getRole()+"\n");
59    	sb.append("Phone Numbers="+Arrays.toString(getPhoneNumbers())+"\n");
60    	sb.append("Address="+getAddress());
61    	sb.append("\n*****************************");
62    	
63    	return sb.toString();
64    }
65}
 1package com.journaldev.model;
 2
 3public class Address {
 4    
 5    private String street;
 6    private String city;
 7    private int zipcode;
 8    
 9    public String getStreet() {
10    	return street;
11    }
12    public void setStreet(String street) {
13    	this.street = street;
14    }
15    public String getCity() {
16    	return city;
17    }
18    public void setCity(String city) {
19    	this.city = city;
20    }
21    public int getZipcode() {
22    	return zipcode;
23    }
24    public void setZipcode(int zipcode) {
25    	this.zipcode = zipcode;
26    }
27    
28    @Override
29    public String toString(){
30    	return getStreet() + ", "+getCity()+", "+getZipcode();
31    }
32}

我已经翻译了 toString() 方法,以返回我们将在 JSON 实现类中使用的可读 String 表示。

Java JSON 阅读示例

 1package com.journaldev.json;
 2
 3import java.io.FileInputStream;
 4import java.io.IOException;
 5import java.io.InputStream;
 6
 7import javax.json.Json;
 8import javax.json.JsonArray;
 9import javax.json.JsonObject;
10import javax.json.JsonReader;
11import javax.json.JsonValue;
12
13import com.journaldev.model.Address;
14import com.journaldev.model.Employee;
15
16public class EmployeeJSONReader {
17
18    public static final String JSON_FILE="employee.txt";
19    
20    public static void main(String[] args) throws IOException {
21    	InputStream fis = new FileInputStream(JSON_FILE);
22    	
23    	//create JsonReader object
24    	JsonReader jsonReader = Json.createReader(fis);
25    	
26    	/**
27    	 * We can create JsonReader from Factory also
28    	JsonReaderFactory factory = Json.createReaderFactory(null);
29    	jsonReader = factory.createReader(fis);
30    	*/
31    	
32    	//get JsonObject from JsonReader
33    	JsonObject jsonObject = jsonReader.readObject();
34    	
35    	//we can close IO resource and JsonReader now
36    	jsonReader.close();
37    	fis.close();
38    	
39    	//Retrieve data from JsonObject and create Employee bean
40    	Employee emp = new Employee();
41    	
42    	emp.setId(jsonObject.getInt("id"));
43    	emp.setName(jsonObject.getString("name"));
44    	emp.setPermanent(jsonObject.getBoolean("permanent"));
45    	emp.setRole(jsonObject.getString("role"));
46    	
47    	//reading arrays from json
48    	JsonArray jsonArray = jsonObject.getJsonArray("phoneNumbers");
49    	long[] numbers = new long[jsonArray.size()];
50    	int index = 0;
51    	for(JsonValue value : jsonArray){
52    		numbers[index++] = Long.parseLong(value.toString());
53    	}
54    	emp.setPhoneNumbers(numbers);
55    	
56    	//reading inner object from json object
57    	JsonObject innerJsonObject = jsonObject.getJsonObject("address");
58    	Address address = new Address();
59    	address.setStreet(innerJsonObject.getString("street"));
60    	address.setCity(innerJsonObject.getString("city"));
61    	address.setZipcode(innerJsonObject.getInt("zipcode"));
62    	emp.setAddress(address);
63    	
64    	//print employee bean information
65    	System.out.println(emp);
66    	
67    }
68
69}

JsonReaderFactory 实现了 Factory Design Pattern

1***** Employee Details *****
2ID=123
3Name=Pankaj Kumar
4Permanent=true
5Role=Developer
6Phone Numbers=[9988664422, 1234567890]
7Address=El Camino Real, San Jose, 95014
8*****************************

Java JSON 写作示例

 1package com.journaldev.json;
 2
 3import java.io.FileNotFoundException;
 4import java.io.FileOutputStream;
 5import java.io.OutputStream;
 6
 7import javax.json.Json;
 8import javax.json.JsonArrayBuilder;
 9import javax.json.JsonObject;
10import javax.json.JsonObjectBuilder;
11import javax.json.JsonWriter;
12
13import com.journaldev.model.Address;
14import com.journaldev.model.Employee;
15
16public class EmployeeJSONWriter {
17
18    public static void main(String[] args) throws FileNotFoundException {
19
20    	Employee emp = createEmployee();
21
22    	JsonObjectBuilder empBuilder = Json.createObjectBuilder();
23    	JsonObjectBuilder addressBuilder = Json.createObjectBuilder();
24    	JsonArrayBuilder phoneNumBuilder = Json.createArrayBuilder();
25
26    	for (long phone : emp.getPhoneNumbers()) {
27    		phoneNumBuilder.add(phone);
28    	}
29    	
30    	addressBuilder.add("street", emp.getAddress().getStreet())
31    					.add("city", emp.getAddress().getCity())
32    						.add("zipcode", emp.getAddress().getZipcode());
33    	
34    	empBuilder.add("id", emp.getId())
35    				.add("name", emp.getName())
36    					.add("permanent", emp.isPermanent())
37    						.add("role", emp.getRole());
38    	
39    	empBuilder.add("phoneNumbers", phoneNumBuilder);
40    	empBuilder.add("address", addressBuilder);
41    	
42    	JsonObject empJsonObject = empBuilder.build();
43    	
44    	System.out.println("Employee JSON String\n"+empJsonObject);
45    	
46    	//write to file
47    	OutputStream os = new FileOutputStream("emp.txt");
48    	JsonWriter jsonWriter = Json.createWriter(os);
49    	/**
50    	 * We can get JsonWriter from JsonWriterFactory also
51    	JsonWriterFactory factory = Json.createWriterFactory(null);
52    	jsonWriter = factory.createWriter(os);
53    	*/
54    	jsonWriter.writeObject(empJsonObject);
55    	jsonWriter.close();
56    }
57    
58
59    public static Employee createEmployee() {
60
61    	Employee emp = new Employee();
62    	emp.setId(100);
63    	emp.setName("David");
64    	emp.setPermanent(false);
65    	emp.setPhoneNumbers(new long[] { 123456, 987654 });
66    	emp.setRole("Manager");
67
68    	Address add = new Address();
69    	add.setCity("Bangalore");
70    	add.setStreet("BTM 1st Stage");
71    	add.setZipcode(560100);
72    	emp.setAddress(add);
73
74    	return emp;
75    }
76
77}

一旦我们运行上面的应用程序,我们得到以下响应:

1Employee JSON String
2{"id":100,"name":"David","permanent":false,"role":"Manager","phoneNumbers":[123456,987654],"address":{"street":"BTM 1st Stage","city":"Bangalore","zipcode":560100}}

JsonObjectBuilder 实现了 builder pattern,使其非常易于使用。

Java JSON 参数示例

Java JsonParser 是一个拖解解析器,我们用 next() 方法读取下一个元素,该元素返回了事件对象。 javax.json.stream.JsonParser.Event 是一个 (Enum)(/community/tutorials/java-enum),使其是安全的和易于使用的元素。

  1package com.journaldev.json;
  2
  3import java.io.FileInputStream;
  4import java.io.IOException;
  5import java.io.InputStream;
  6import java.util.ArrayList;
  7import java.util.List;
  8
  9import javax.json.Json;
 10import javax.json.stream.JsonParser;
 11import javax.json.stream.JsonParser.Event;
 12
 13import com.journaldev.model.Address;
 14import com.journaldev.model.Employee;
 15
 16public class EmployeeJSONParser {
 17
 18    public static final String FILE_NAME = "employee.txt";
 19
 20    public static void main(String[] args) throws IOException {
 21    	InputStream fis = new FileInputStream(FILE_NAME);
 22
 23    	JsonParser jsonParser = Json.createParser(fis);
 24
 25    	/**
 26    	 * We can create JsonParser from JsonParserFactory also with below code
 27    	 * JsonParserFactory factory = Json.createParserFactory(null);
 28    	 * jsonParser = factory.createParser(fis);
 29    	 */
 30
 31    	Employee emp = new Employee();
 32    	Address address = new Address();
 33    	String keyName = null;
 34    	List<Long> phoneNums = new ArrayList<Long>();
 35    	
 36    	while (jsonParser.hasNext()) {
 37    		Event event = jsonParser.next();
 38    		switch (event) {
 39    		case KEY_NAME:
 40    			keyName = jsonParser.getString();
 41    			break;
 42    		case VALUE_STRING:
 43    			setStringValues(emp, address, keyName, jsonParser.getString());
 44    			break;
 45    		case VALUE_NUMBER:
 46    			setNumberValues(emp, address, keyName, jsonParser.getLong(), phoneNums);
 47    			break;
 48    		case VALUE_FALSE:
 49    			setBooleanValues(emp, address, keyName, false);
 50    			break;
 51    		case VALUE_TRUE:
 52    			setBooleanValues(emp, address, keyName, true);
 53    			break;
 54    		case VALUE_NULL:
 55    			// don't set anything
 56    			break;
 57    		default:
 58    			// we are not looking for other events
 59    		}
 60    	}
 61    	emp.setAddress(address);
 62    	long[] nums = new long[phoneNums.size()];
 63    	int index = 0;
 64    	for(Long l :phoneNums){
 65    		nums[index++] = l;
 66    	}
 67    	emp.setPhoneNumbers(nums);
 68    	
 69    	System.out.println(emp);
 70    	
 71    	//close resources
 72    	fis.close();
 73    	jsonParser.close();
 74    }
 75
 76    private static void setNumberValues(Employee emp, Address address,
 77    		String keyName, long value, List<Long> phoneNums) {
 78    	switch(keyName){
 79    	case "zipcode":
 80    		address.setZipcode((int)value);
 81    		break;
 82    	case "id":
 83    		emp.setId((int) value);
 84    		break;
 85    	case "phoneNumbers":
 86    		phoneNums.add(value);
 87    		break;
 88    	default:
 89    		System.out.println("Unknown element with key="+keyName);	
 90    	}
 91    }
 92
 93    private static void setBooleanValues(Employee emp, Address address,
 94    		String key, boolean value) {
 95    	if("permanent".equals(key)){
 96    		emp.setPermanent(value);
 97    	}else{
 98    		System.out.println("Unknown element with key="+key);
 99    	}
100    }
101
102    private static void setStringValues(Employee emp, Address address,
103    		String key, String value) {
104    	switch(key){
105    	case "name":
106    		emp.setName(value);
107    		break;
108    	case "role":
109    		emp.setRole(value);
110    		break;
111    	case "city":
112    		address.setCity(value);
113    		break;
114    	case "street":
115    		address.setStreet(value);
116    		break;
117    	default:
118    		System.out.println("Unknown Key="+key);
119    			
120    	}
121    }
122
123}

主要的复杂性是当我们需要写逻辑来分析数据时,有时它可以变得复杂. 由于我们正在阅读与JsonReader相同的文件,输出与EmployeeJsonReader程序相同。

Java JsonGenerator 例子

 1package com.journaldev.json;
 2
 3import java.io.FileOutputStream;
 4import java.io.IOException;
 5import java.io.OutputStream;
 6
 7import javax.json.Json;
 8import javax.json.stream.JsonGenerator;
 9
10import com.journaldev.model.Employee;
11
12public class EmployeeJSONGenerator {
13
14    public static void main(String[] args) throws IOException {
15    	OutputStream fos = new FileOutputStream("emp_stream.txt");
16    	JsonGenerator jsonGenerator = Json.createGenerator(fos);
17    	/**
18    	 * We can get JsonGenerator from Factory class also
19    	 * JsonGeneratorFactory factory = Json.createGeneratorFactory(null);
20    	 * jsonGenerator = factory.createGenerator(fos);
21    	 */
22    	
23    	Employee emp = EmployeeJSONWriter.createEmployee();
24    	jsonGenerator.writeStartObject(); // {
25    	jsonGenerator.write("id", emp.getId()); // "id":123
26    	jsonGenerator.write("name", emp.getName());
27    	jsonGenerator.write("role", emp.getRole());
28    	jsonGenerator.write("permanent", emp.isPermanent());
29    	
30    	jsonGenerator.writeStartObject("address") //start of address object
31    		.write("street", emp.getAddress().getStreet())
32    		.write("city",emp.getAddress().getCity())
33    		.write("zipcode",emp.getAddress().getZipcode())
34    		.writeEnd(); //end of address object
35    	
36    	jsonGenerator.writeStartArray("phoneNumbers"); //start of phone num array
37    	for(long num : emp.getPhoneNumbers()){
38    		jsonGenerator.write(num);
39    	}
40    	jsonGenerator.writeEnd(); // end of phone num array
41    	jsonGenerator.writeEnd(); // }
42    	
43    	jsonGenerator.close();
44    	
45    }
46
47}

JsonGenerator 非常易于使用,为大数据提供良好的性能,这对于 Java JSON 处理 API 来说都是如此。我们了解了 Java JSON Parser、阅读和写作示例,您可以从下面的链接下载 Java 项目并玩它。

(下载Java JSON项目)

参考: JSONLint - 验证 JSON 数据的伟大 Web 工具 JSON 处理参考实施 JSR353 JCP 页面

Published At
Categories with 技术
Tagged with
comments powered by Disqus