【转载】net.sf.json.JSONObject处理 "null" 字符串的一些坑
时间:2020-05-18
本文章向大家介绍【转载】net.sf.json.JSONObject处理 "null" 字符串的一些坑,主要包括【转载】net.sf.json.JSONObject处理 "null" 字符串的一些坑使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
原链接:点这里
添加依赖
<dependency> <groupId>net.sf.json-lib</groupId> <artifactId>json-lib</artifactId> <version>2.4</version> <classifier>jdk15</classifier> </dependency>
示例代码
package com.ahut; import net.sf.json.JSONObject; import org.junit.Test; import org.springframework.boot.test.context.SpringBootTest; import java.util.Map; @SpringBootTest public class ConfigClientApplicationTests { @Test public void contextLoads() { JSONObject jsonObject = new JSONObject(); jsonObject.put("key", "null"); jsonObject.put("key2", "notNull"); Map itemsMap = (Map) jsonObject; System.out.println(jsonObject.get("key").getClass());//class net.sf.json.JSONNull System.out.println(jsonObject.get("key2").getClass());//class java.lang.String System.out.println(itemsMap.get("key").equals("null"));//true System.out.println("null".equals(itemsMap.get("key")));//false System.out.println(itemsMap.get("key2").equals("notNull"));//true System.out.println("notNull".equals(itemsMap.get("key2")));//true } }
运行结果:
class net.sf.json.JSONNull class java.lang.String true false true true
代码分析
net.sf.json.JSONObject本身就实现了Map接口:
public final class JSONObject extends AbstractJSON implements JSON, Map, Comparable { ... }
其内部维护了一个Map属性,实际就是一个HashMap:
// 成员变量 private Map properties; // 构造方法 public JSONObject() { this.properties = new ListOrderedMap(); } public ListOrderedMap() { this(new HashMap()); }
注意:
- 非”null”字符串放到JSONObject类中时,取出来使用时是java.lang.String类型
- “null”字符串放到JSONObject类中时,取出来的使用会转换成net.sf.json.JSONNull类型:
1 // 2 // Source code recreated from a .class file by IntelliJ IDEA 3 // (powered by Fernflower decompiler) 4 // 5 6 package net.sf.json; 7 8 import java.io.IOException; 9 import java.io.Writer; 10 11 public final class JSONNull implements JSON { 12 private static JSONNull instance = new JSONNull(); 13 14 public static JSONNull getInstance() { 15 return instance; 16 } 17 18 private JSONNull() { 19 } 20 21 public boolean equals(Object object) { 22 return object == null || object == this || object == instance || object instanceof JSONObject && ((JSONObject)object).isNullObject() || "null".equals(object); 23 } 24 25 public int hashCode() { 26 return 37 + "null".hashCode(); 27 } 28 29 public boolean isArray() { 30 return false; 31 } 32 33 public boolean isEmpty() { 34 throw new JSONException("Object is null"); 35 } 36 37 public int size() { 38 throw new JSONException("Object is null"); 39 } 40 41 public String toString() { 42 return "null"; 43 } 44 45 public String toString(int indentFactor) { 46 return this.toString(); 47 } 48 49 public String toString(int indentFactor, int indent) { 50 StringBuffer sb = new StringBuffer(); 51 52 for(int i = 0; i < indent; ++i) { 53 sb.append(' '); 54 } 55 56 sb.append(this.toString()); 57 return sb.toString(); 58 } 59 60 public Writer write(Writer writer) { 61 try { 62 writer.write(this.toString()); 63 return writer; 64 } catch (IOException var3) { 65 throw new JSONException(var3); 66 } 67 } 68 }
这就是为什么:
1 System.out.println(jsonObject.get("key").getClass());//class net.sf.json.JSONNull 2 3 System.out.println(jsonObject.get("key2").getClass());//class java.lang.String
itemsMap.get(“key”).equals(“null”)
分析:
1 JSONObject jsonObject = new JSONObject(); 2 3 jsonObject.put("key", "null"); 4 5 Map itemsMap = (Map) jsonObject; 6 7 System.out.println(itemsMap.get("key").equals("null"));
键为 “key” 的值对应 “null” 字符串
所以itemsMap.get(“key”)获取到的类型是JSONNull
所以itemsMap.get(“key”).equals(“null”)中的equals调用的是JSONNull中的equals方法
public boolean equals(Object object) { return object == null || object == this || object == instance || object instanceof JSONObject && ((JSONObject)object).isNullObject() || "null".equals(object); }
所以:
System.out.println(itemsMap.get("key").equals("null"));//true
“null”.equals(itemsMap.get(“key”))
分析:
1 JSONObject jsonObject = new JSONObject(); 2 3 jsonObject.put("key", "null"); 4 5 Map itemsMap = (Map) jsonObject; 6 7 System.out.println("null".equals(itemsMap.get("key")));
此时”null”.equals(itemsMap.get(“key”))调用的equals是String类的equals方法:
1 /** 2 * String复写的equals方法 3 */ 4 public boolean equals(Object anObject) { 5 6 // 比较地址是否相同,两个应用指向同一个对象(同一个地址) 7 if (this == anObject) { 8 return true; 9 } 10 11 // 判断是否是String类 12 if (anObject instanceof String) { 13 String anotherString = (String)anObject; 14 int n = value.length; 15 if (n == anotherString.value.length) { 16 char v1[] = value; 17 char v2[] = anotherString.value; 18 int i = 0; 19 while (n-- != 0) { 20 if (v1[i] != v2[i]) 21 return false; 22 i++; 23 } 24 return true; 25 } 26 } 27 28 // 返回结果 29 return false; 30 }
执行分析:
itemsMap.get(“key”)获取到的是net.sf.json.JSONNull类型
net.sf.json.JSONNull和”null”不是同一个对象,继续向下执行
net.sf.json.JSONNull不是String类型,继续向下执行
return false
所以:
System.out.println("null".equals(itemsMap.get("key")));//false
原文地址:https://www.cnblogs.com/lixiaoxu/p/12909114.html
- iOS网络——AFNetworking AFURLSessionManager源码解析
- 1692: [Usaco2007 Dec]队列变换(BZOJ1640强化版)
- 1620: [Usaco2008 Nov]Time Management 时间管理
- 手把手教你树莓派linux内核如何编译
- js处理异常try{}catch(e){}
- 1634: [Usaco2007 Jan]Protecting the Flowers 护花
- C#用链式方法表达循环嵌套1
- C#用链式方法表达循环嵌套2
- 【开源】1句代码搞定图片批量上传,无需什么代码功底【无语言界限】
- C#异步调用的方法
- 【David Silver 深度强化学习教程代码实战07】 DQN的实现
- AutoMapper随笔记
- 简析.NET Core 以及与 .NET Framework的关系
- 1627: [Usaco2007 Dec]穿越泥地
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- koa框架生成微信公众号二维码
- KVM 实现虚拟机在线热迁移
- 机器重启后 docker 容器启动报错 error creating overlay mount t
- 微信小程序开发实战(14):音频组件(audio)
- dotnet OpenXML 文本 BodyProperties 的属性作用
- 微信小程序开发实战(15):视频组件(video)
- LeetCode 91,点赞和反对五五开,这题是好是坏由你来评判
- 打破国外垄断,开发中国人自己的编程语言(1):编写解析表达式的计算器
- 在CentOS8上编译安装开源EDA工具——Surelog
- 直播带货小程序源码中,商品详情页是如何获取html图片的
- LeetCode 90 | 经典递归问题,求出所有不重复的子集II
- 万字长文|Swift语法全面解析|附示例
- sshd服务搭建与管理
- Airflow Dag可视化管理编辑工具Airflow Console
- 使用 Clientset 获取 Kubernetes 资源对象