JAVA对JSON的数据处理和遇到的问题
JAVA处理JSON数据步骤
导入的是阿里的fastjson,提供将对象转换成JSON格式的字符串,以及将JSON格式的字符串反过来创建对象
首先得在.xml文件中添加依赖:
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.66</version>
</dependency>
将对象转JSON格式的字符串
String s = JSON.toJSONString(esp32);//esp32是我创建的一个传感器对象
将JSON格式的字符串反过来创建对象
ESP32 te= JSON.parseObject( s2, ESP32.class);
以我本次使用的JSON格式为{属性:值,属性:值}的形式为例
反过来创建对象采用的JSON格式的字符串有如下两种格式
先说明创建的对象是ESP32的一个开发板对象:
public class ESP32 {
public String name;
public String state;
public String data;
public int command; //0 :上传数据 1:开/关
@Override
public String toString() {
return "ESP32{" +
"name='" + name + '\'' +
", state='" + state + '\'' +
", data='" + data + '\'' +
", command=" + command +
'}';
}
}
两种json格式的字符串
第一种
String s="{'data':\"123\", 'name':\"esp32\", 'state':\"ON\",'command':1}";
第二种:
String s2= "{\"data\":\"1203\", \"name\":\"esp32\", \"state\":\"ON\"}";
加 ""是为了区分和前面的 "不是同一对,故加单引号区分也行。
**
遇到的坑点:
坑点一:
在同一个包内,通过JSON反过来创建对象实例或是将对象转换成JSON格式的字符串形式,对象所属于的类必须是public修饰,如果是默认不加修饰符,则是友好friendly修饰的,按默认修饰符在一个包中也是能访问的,但以它(默认不加修饰符修饰的类成员变量)反过来创建对象其默认的修饰符修饰的成员变量值就为null,以对象转换的JSON格式的字符串也不会有默认修饰符修饰的成员变量的键以其所对应的值。
如以下代码(将上面代码中的esp32类中的public修饰的name去掉public)
再执行一下代码块
ESP32 esp32 =new ESP32();
esp32.data="123";
esp32.name="esp322";
esp32.state="ON";
System.out.println(esp32.toString());
String s = JSON.toJSONString(esp32);
System.out.println(s);
String s2= null;
s2= "{\"data\":\"1203\", \"name\":\"esp32\", \"state\":\"ON\"}";
ESP32 te= JSON.parseObject( s2, ESP32.class);
System.out.println(te.toString());
运行结果(在控制台显示):
//打印ESP32的tostring
ESP32{name='esp322', state='ON', data='123', command=0}
//将esp32对象转JSON字符串,发现没有name
{"command":0,"data":"123","state":"ON"}
//将完整的JSON格式的字符串s2转对象,尽管JSON格式完整(对应的成员变量属性都有),但依然反过来创建的对象name为null
ESP32{name='null', state='ON', data='1203', command=0}
坑点二
在通过接受Mqtt服务器传来的JSON格式的字符串并将数据上传到Mysql数据库时,如果JSON格式不正确是IJ(编译器)是识别不了的,正如上面的两种格式在IJ编译器中能识别,实际上两种就是一样的,双引号,单引号只是为了区分 和字符串最外层的 "不是同一对。
String s="{'data':\"123\", 'name':\"esp32\", 'state':\"ON\",'command':1}";
String s2= "{\"data\":\"1203\", \"name\":\"esp32\", \"state\":\"ON\"}";
说白了就是编译器必须要这样加如此的多的 " \ "来区分它才认识,但服务器发JSON报文可不需要这样加 ” \ ",直接以
{ 属性:值,
属性:值,
属性:值
}
发送报文给服务器就好了,这样IJ编译器也是能识别的
比如以Paho发消息给订阅的主题,不需要加 " \ ",加了适得其反,使得JAVA客户端收到后创建不了对象,并让服务器直接断开重新连接。这是来自IJ编译器形成思维定势的教训
{“data”:"123",
”name“:"esp32",
“state”:"ON",
”command“:1}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?