锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

使用Java解析JSON

时间:2022-09-05 11:00:00 薄型红外对射传感器光电开关ex

JSON全称为Java Script Object NoTation。它作为一种轻量级数据交换格式,广泛应用于各种平台,在两个系统之间的数据交换中起着不可或缺的作用。JSON有两种结构:JSON对象和JSON集合。JSON对象为{key:value,key:value,...}键值对形式,key对象的属性,value对应属性的值。JSON集合为["Java","JSON","Apesource"]字段值的类型可以是字符串、数字、数组、对象等。同时,JSON不支持注释。并且,JSON数据可以和js同样形成数据JSON文件。

JSON数据具有以下优点:

1、JSON中使用UTF-8编码,所以没有转码问题。

2、JSON内容仅包含key-value键值对,格式简单,不存在冗余结构。

3.内置浏览器JSON支持,如果数据发送到浏览器,可以使用JavaScript直接处理。

在Java中解析JSON个人推荐的第三方库有,FastJSON、Jackson,FastJSON阿里巴巴开源JSON可以分析的分析库JSON支持格式字符串的格式JavaBean序列化为JSON数据,也可以将JSON数据反序列化为JavaBean。

JavaBean序列化为JSON主要通过数据toJSONString()方法。

toJSONString方法源代码如下:

 static String toJSONString(Object object) {         try (JSONWriter writer = JSONWriter.of()) {             if (object == null) {                 writer.writeNull();             } else {                 Class valueClass = object.getClass();                 ObjectWriter objectWriter = writer.getObjectWriter(valueClass, valueClass);                 objectWriter.write(writer, object, null, null, 0);             }             return writer.toString();         } catch (NullPointerException | NumberFormatException ex) {             throw new JSONException("toJSONString error", ex);         }     }

例如,一个PoliceStation实体对象序列化为JSON数据

PoliceStation实体类

package com.apesource.entity;  // 派出所实体类 public class PoliceStation {    private String name; // 警察局的名字  private String addr; // 地址  private String tel;  // 联系电话      public String getName() {   return name;  }  public void setName(String name) {   this.name = name;  }  public String getAddr() {   return addr;  }  public void setAddr(String addr) {   this.addr = addr;  }  public String getTel() {   return tel;  }  public void setTel(String tel) {   this.tel = tel;  }  @Override  public String toString() {   return "PoliceStation [name="   name   ", addr="   addr   ", tel="   tel   "]";  }     } 

序列化:

public class Demo01 {  public static void main(String[] args) {   PoliceStation psl = new PoliceStation();   psl.setAddr("北京市房山区");   psl.setName("房山区派出所");   psl.setTel("110");    // "序列化",将Java对象转换成json格式   String str = JSON.toJSONString(psl);   System.out.println(str);

结果如下:

JSON数据字符串反序列化JavaBean主要通过parseObject()方法

parseObject()源代码如下:

 @SuppressWarnings("unchecked")     static  T parseObject(String text, Class clazz) {         if (text == null || text.isEmpty()) {             return null;         }          try (JSONReader reader = JSONReader.of(text)) {             JSONReader.Context context = reader.context;              boolean fieldBased = (context.features & JSONReader.Feature.FieldBased.mask) != 0;             ObjectReader objectReader = context.provider.getObjectReader(clazz, fieldBased);              T object = objectReader.readObject(reader, 0);             if (reader.resolveTasks != null) {                 reader.handleResolveTasks(object);             }             return object;         }     }

例如,一个JSON数据字符串反序列化JavaBean

package com.apesource;  import com.alibaba.fastjson2.JSON; import com.alibaba.fastjson2.JSONObject; import com.apesource.entity.PoliceStation;  public class Demo01 {  public static void main(String[] args) {         // 反序列化,将json格式字符串转换成JAVA对象   String strJson = "{\"addr\":\"北京市房山区\",\"name\":\"房山区派出所\",\"tel\":\"110\"}";   PoliceStation ps2 = JSON.parseObject(strJson, PoliceStation.class);   System.out.println(ps2); }

结果如下:

在明确解析JSON在数据之后,我们可以尝试使用更复杂的数据进行分析。

{  "sk": {   "temp": "32",   "wind_direction": "东北风",   "wind_strength": "5级",   "humidity": "53%",   "time": "14:38"  },  "today": {   "temperature": "24℃~39℃",   "weather": "小雨",   "weather_id": {    "fa": "07",    "fb": "07"   },   "wind": "东北风3-5级",   "week": "星期一",   "city": "西安",   "date_y": "2022年07月11日",   "dressing_index": "炎热",   "dressing_advice": "天气炎热,建议着短衫、短裙、短裤、薄型T恤衫等清凉夏季服装。",   "uv_index": "弱",   "comfort_index": "",   "wash_indx": "不宜",
		"travel_index": "较适宜",
		"exercise_index": "较适宜",
		"drying_index": ""
	},
	"future": {
		"day_20220711": {
			"temperature": "24℃~39℃",
			"weather": "小雨",
			"weather_id": {
				"fa": "07",
				"fb": "07"
			},
			"wind": "东北风3-5级",
			"week": "星期一",
			"date": "20220711"
		},
		"day_20220712": {
			"temperature": "24℃~27℃",
			"weather": "小雨",
			"weather_id": {
				"fa": "07",
				"fb": "07"
			},
			"wind": "北风微风",
			"week": "星期二",
			"date": "20220712"
		},
		"day_20220713": {
			"temperature": "25℃~30℃",
			"weather": "小雨",
			"weather_id": {
				"fa": "07",
				"fb": "07"
			},
			"wind": "北风微风",
			"week": "星期三",
			"date": "20220713"
		},
		"day_20220714": {
			"temperature": "25℃~34℃",
			"weather": "阴转多云",
			"weather_id": {
				"fa": "02",
				"fb": "01"
			},
			"wind": "东北风微风",
			"week": "星期四",
			"date": "20220714"
		},
		"day_20220715": {
			"temperature": "25℃~34℃",
			"weather": "阴转小雨",
			"weather_id": {
				"fa": "02",
				"fb": "07"
			},
			"wind": "东北风4-5级",
			"week": "星期五",
			"date": "20220715"
		},
		"day_20220716": {
			"temperature": "24℃~27℃",
			"weather": "小雨",
			"weather_id": {
				"fa": "07",
				"fb": "07"
			},
			"wind": "北风微风",
			"week": "星期六",
			"date": "20220716"
		},
		"day_20220717": {
			"temperature": "25℃~34℃",
			"weather": "阴转多云",
			"weather_id": {
				"fa": "02",
				"fb": "01"
			},
			"wind": "东北风微风",
			"week": "星期日",
			"date": "20220717"
		}
	}
}

1.解析sk部分(sk部分是一个key-value形式的键值对对象)

可以使用JSONObject.get方法获取Json对象中的某个key对应的value

String sk = (String)jsonObj.get("sk");

2.解析today部分,观察得知,today部分为多层JSON对象的嵌套,所以需要逐层解析

Set> set1 = jsonFuture.entrySet();
		for (Entry entry : set1) {
			JSONObject jsonObj = (JSONObject)entry.getValue();
			System.out.println("日期:" + jsonObj.getString("date"));
			System.out.println("温度:" + jsonObj.getString("temperature"));
			System.out.println("风力:" + jsonObj.getString("wind"));
			System.out.println("天气:" + jsonObj.getString("weather"));
			System.out.println();
		}

3.future部分的解析与today部分类似,暂不展开解析。

锐单商城拥有海量元器件数据手册IC替代型号,打造电子元器件IC百科大全!

相关文章