JavaSE18章_JSON解析详解
一、JSON简介
JSON(JavaScript Object Notation),是一种轻量级的数据交换格式。JSON是存储和交换文本信息的,语法类似 XML。易于人阅读和编写,同时也易于机器解析和生成。JSON采用完全独立于语言的文本格式,但是也使JSON比XML更小、更快,更易解析。用了类似于C语言家族的习惯,这些特性使JSON成为理想的数据交换语言。
二、JSON语法
JSON具有以下这些形式:
对象是一个无序的“‘名称/值’对”集合。一个对象以“{”(左括号)开始,“}”(右括号)结束。每个“名称”后跟一个“:”(冒号);“‘名称/值’ 对”之间使用“,”(逗号)分隔。
数组是值(value)的有序集合。一个数组以“[”(左中括号)开始,“]”(右中括号)结束。值之间使用“,”(逗号)分隔。
值(value)可以是双引号括起来的字符串(string)、数值(number)、true
、false
、 null
、对象(object)或者数组(array)。这些结构可以嵌套。
字符串(string)是由双引号包围的任意数量Unicode字符的集合,使用反斜线转义。一个字符(character)即一个单独的字符串(character string)。
字符串(string)与C或者Java的字符串非常相似。
数值(number)也与C或者Java的数值非常相似。除去未曾使用的八进制与十六进制格式。除去一些编码细节。
示例:
{ "name":"小明", "age":20, "car":false, "aihao":[{"id":1,"name":" 上网"},{"id":2,"name":"看电影"}], "zy":["Java","C++"], "注释":"这个是注释" }
三、JSON解析
1、常用的json解析,导入json-org.jar包,下载地址 https://github.com/stleary/JSON-java,示例代码如下
1 import java.io.BufferedReader; 2 import java.io.FileReader; 3 import java.io.IOException; 4 import org.json.JSONArray; 5 import org.json.JSONException; 6 import org.json.JSONObject; 7 8 public class JsonReader { 9 10 public static void main(String[] args) throws IOException, JSONException { 11 12 //使用输入流,读取json文件 13 BufferedReader br = new BufferedReader(new FileReader("person.json")); 14 String str; 15 StringBuilder sb = new StringBuilder(); 16 while((str=br.readLine())!=null){ 17 sb.append(str); 18 } 19 br.close(); 20 21 //实例化JSONObject,把json文件转为字符串形式来解析 22 JSONObject obj = new JSONObject(sb.toString()); 23 System.out.println("姓名:"+obj.getString("name")); 24 System.out.println("年龄:"+obj.getInt("age")); 25 System.out.println("是否有车:"+obj.getBoolean("car")); 26 27 //数组内的值为对象时,强转为JSONObject类型 28 JSONArray arr = obj.getJSONArray("aihao"); 29 for (int i = 0; i < arr.length(); i++) { 30 JSONObject arrObj = (JSONObject) arr.get(i); 31 System.out.print("爱好"+arrObj.getInt("id")+":"); 32 System.out.println(arrObj.getString("name")); 33 } 34 35 //数组内的值为字符串时,强转为String类型 36 JSONArray arr2 = obj.getJSONArray("zy"); 37 for (int i = 0; i < arr2.length(); i++) { 38 String s = (String) arr2.get(i); 39 System.out.println(s); 40 } 41 42 System.out.println(obj.getString("注释")); 43 44 } 45 46 }
2、写出json文件
1 package com.zhidi.gjson; 2 3 import java.util.HashMap; 4 import java.util.Map; 5 6 import org.json.JSONException; 7 import org.json.JSONObject; 8 9 public class WriterJson { 10 11 public static void main(String[] args) throws JSONException { 12 // WriterJson.JsonObject(); 13 // WriterJson.JsonByMap(); 14 WriterJson.JsonByJavaBean(); 15 16 } 17 18 19 public static void JsonObject() throws JSONException{ 20 JSONObject obj = new JSONObject(); 21 Object objnull = null; 22 obj.put("name", "小明"); 23 obj.put("age", 20); 24 obj.put("car", objnull); 25 obj.put("zy", new String[]{"Java","C++"}); 26 System.out.println(obj.toString()); 27 } 28 29 public static void JsonByMap(){ 30 Map<String,Object> map = new HashMap<String,Object>(); 31 map.put("name", "小明"); 32 map.put("age", 20); 33 map.put("car", false); 34 map.put("skill", new String[]{"挖掘机","厨师"}); 35 JSONObject obj = new JSONObject(map); 36 System.out.println(obj.toString()); 37 } 38 39 public static void JsonByJavaBean(){ 40 Person p = new Person(); 41 p.setName("小明"); 42 p.setAge(20); 43 p.setZy(new String[]{"Java","C++"}); 44 45 System.out.println(new JSONObject(p).toString()); 46 } 47 48 }
3、使用GSON解析,导入gson-2.3.1.jar包
1 import java.io.BufferedReader; 2 import java.io.IOException; 3 import java.io.InputStream; 4 import java.io.InputStreamReader; 5 import java.net.URL; 6 7 import com.google.gson.JsonIOException; 8 import com.google.gson.JsonObject; 9 import com.google.gson.JsonParser; 10 import com.google.gson.JsonSyntaxException; 11 12 public class GJSONReaderDemo { 13 14 public static void main(String[] args) throws JsonIOException, JsonSyntaxException, IOException { 15 URL url = new URL("http://www.weather.com.cn/data/sk/101010100.html"); 16 InputStream is = url.openStream(); 17 InputStreamReader isr = new InputStreamReader(is,"utf-8"); 18 BufferedReader br = new BufferedReader(isr); 19 String str ; 20 StringBuilder sb = new StringBuilder(); 21 while((str=br.readLine())!=null){ 22 sb.append(str); 23 } 24 br.close(); 25 isr.close(); 26 is.close(); 27 JsonParser parser = new JsonParser(); 28 JsonObject object = (JsonObject) parser.parse(sb.toString()); 29 JsonObject obj = object.get("weatherinfo").getAsJsonObject(); 30 System.out.println(obj.get("city").getAsString()); 31 System.out.println(obj.get("WD").getAsString()); 32 33 } 34 35 36 }
4、使用GSON写出json文件
1 import java.lang.reflect.Field; 2 import com.google.gson.FieldNamingStrategy; 3 import com.google.gson.Gson; 4 import com.google.gson.GsonBuilder; 5 import com.google.gson.JsonArray; 6 import com.google.gson.JsonObject; 7 8 public class GJSONWriterDemo { 9 10 public static void main(String[] args) { 11 12 // GJSONWriterDemo.JavaBean(); 13 GJSONWriterDemo.JavaBean2(); 14 // GJSONWriterDemo.JsonObj(); 15 } 16 17 public static void JavaBean(){ 18 Person p = new Person(); 19 p.setName("小明"); 20 p.setAge(20); 21 p.setZy(new String[]{"Java","C++"}); 22 23 Gson gson = new Gson(); 24 System.out.println(gson.toJson(p)); 25 } 26 27 public static void JavaBean2(){ 28 Person p = new Person(); 29 p.setName("小明"); 30 p.setAge(20); 31 p.setZy(new String[]{"Java","C++"}); 32 p.setNosee("这个属性看不到"); 33 34 GsonBuilder gb = new GsonBuilder(); 35 gb.setPrettyPrinting(); 36 gb.setFieldNamingStrategy(new FieldNamingStrategy() { 37 38 @Override 39 public String translateName(Field f) { 40 if(f.getName().equals("name")){ 41 return "Name"; 42 } 43 return f.getName(); 44 } 45 }); 46 Gson gson = gb.create(); 47 System.out.println(gson.toJson(p)); 48 } 49 50 public static void JsonObj(){ 51 JsonObject object = new JsonObject(); 52 object.addProperty("cat", "it"); 53 54 JsonArray array = new JsonArray(); 55 56 JsonObject obj = new JsonObject(); 57 obj.addProperty("id", 1); 58 obj.addProperty("name", "java"); 59 array.add(obj); 60 JsonObject obj2 = new JsonObject(); 61 obj2.addProperty("id", 1); 62 obj2.addProperty("name", "java"); 63 array.add(obj2); 64 65 object.add("language", array); 66 object.addProperty("pop", true); 67 68 System.out.println(object.toString()); 69 } 70 71 }