【JSON】
一、JSON格式入门
基础类型: false / null / true / object / array / number / string
几种形式:
1、JSONArray: 见employees字段
2、JSONString: company字段
3、JSONObject:
格式化工具
1、https://jsoneditoronline.org/
2、转义网站:https://www.sojson.com/yasuo.html
二、安全编码
1、JsonSanitizer.sanitize(中文含义:杀毒)
三、fastJson使用
参考:http://kimmking.github.io/2017/06/06/json-best-practice/
核心方法
1. JSON.parseObject(jsonStr, xxx.class) :将字符串转成Java类对象
2. JSON.parseObject(jsonStr): 得到JSONObject,后续可使用getString(字段名)/getInteger(字段名)/getJSONArray(字段名)得到具体字段数值。
3. JSON.toJSONString(JavaObject): 将Java对象,转成JSON格式字符串
具体验证如下:
pom.xml
<dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.32</version> </dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.12</version>
</dependency>
Bean定义:
1、使用FastJson读写
执行结果
2、将Java Bean尝试转JSON串
打印:{"companyName":"AAA","employees":["bbb","ccc"],"mobile":888888}
3、如果尝试转成其他Bean
@Setter @Getter public class Model { private String name; private String value; private Integer mobile; }
则java bean解析结果:仅mobile成功初始化(仅拼写相同的字段匹配)
四、jackson使用
JsonNode,是Jackson的json树模型
参考:https://www.baeldung.com/jackson-object-mapper-tutorial
方法:
1、读json为Java对象: objectMapper.readValue(数据源, Class) , 如转换读取Person对象,数据源包括URL/InputStream/String/Reader/File等
2、读json为JsonNode: objectMapper.readTree(数据源)方法,数据源包括URL/InputStream/String/Reader/File等
3、写JsonNode至json: objectMapper.writeValueAsString(Bean对象)方法,或其他适合你的写方法(writeValue),
4、获取JsonNode: 1) jsonNode.get("field1"); 2)使用at访问得到jsonNode:jsonNode.at("/identification/name")
5、转换jsonNode: asText/asDouble/asInt/asLong
注解:
@JsonIgnoreProperties(ignoreUnknown = true): 加在实体类上,目的:防止因传入的json字符串属性的缺少或过多超过Bean定义而JSON解析报错
// Bean定义
@JsonProperty("AAA") ---》 待转换JSON字符串中AAA的字段值被赋值给serverip private String serverip;
1、简单对象
String json = "{ \"color\" : \"Black\", \"type\" : \"BMW\" }"; Map<String, Object> map = objectMapper.readValue(json, new TypeReference<Map<String,Object>>(){});
2、JSON类型全是Map类型
Map<String, Object> map = objectMapper.readValue(json, new TypeReference<Map<String,Object>>(){});
或定义一个bean
@Getter @Setter @JsonIgnoreProperties(ignoreUnknown = true) public class CMDBUpdateNotificationBean { @JsonProperty("context") private Map<String, String> context; @JsonProperty("payload") private Map<String, String> payload; }
3、JSON中包含复杂对象的数组场景
String rawJsonStr = "{\"currentPage\":1,\"objList\":[{\"mac_name\":\"eth0,lo\",\"hard_disk\":\"40\",\"memory\":\"15868\",\"os\":\"EulerOS release 2.0 \\u0028SP5\\u0029\",\"create_time\":\"2015-10-28 11:47:39\",\"kernel\":\"3.10.0-862.14.1.5.h428.eulerosv2r7.x86_64\",\"class_Id\":1247,\"ip\":\"10.21.0.44\",\"resource_type\":\"hws_ecs\",\"cpu\":\"8\",\"remark\":\"\",\"datacenter\":6165801,\"main_mac\":\"fa:16:3e:2c:a4:d0\",\"net_interface\":\"eth0\",\"check_status\":\"NORMAL\",\"monitor_status\":\"已监控\",\"start_time\":\"2021-09-17\",\"hostname\":\"host-10-21-0-44\",\"update_time\":\"2021-10-16 09:41:20\",\"class_Name\":\"VMServer\",\"assign_status\":\"INUSE\",\"id\":20,\"last_Modified\":1634377280284}],\"pageSize\":1,\"totalNum\":1,\"totalPageNo\":1}";
Java Bean使用list的方式定义 /** * 总页数 */ @JsonProperty("totalPageNo") private int totalPageNo; @JsonProperty("objList") private List<Server> serverList; 解析 ServerBatchResponse serverBatchResponse = null; serverBatchResponse = objectMapper.readValue(rawJsonStr, ServerBatchResponse.class); for (Server server : serverBatchResponse.getServerList()) { System.out.println(server.getHard_disk()); }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 上周热点回顾(3.3-3.9)