这里举例一个网络传输来的字符串(json格式字符串)
[{ “foodLangInfoVOList”: [{“name”: “soli”}], “menuFoodRelationVO”: {“amount”: “14”, “secUnitDesc”: “łyżeczki”}, “desc”: “płaskie” }, {“foodLangInfoVOList”: [{“name”: “wody”}], “menuFoodRelationVO”: {“amount”: “1500”, “secUnitDesc”: “null”}, “desc”: “null”}]
这里解释下:
上面是一个JSON格式的字符串,其中包含了两个对象,每个对象有三个属性,分别是 “foodLangInfoVOList”、“menuFoodRelationVO” 和 “desc”。其中 “foodLangInfoVOList” 和 “menuFoodRelationVO” 属性的值也是对象,它们分别包含了各自的属性和属性值。该字符串的具体含义需要根据上下文和业务场景进行解析,(这里用来app传输食材表,这篇文章无需关注这个)
可以看出上面的是个json数组字符串,这个jsonarray字符串里面中的每一个元素都有一个foodLangInfoVOList字段的数组,数组的第一个元素里包含name字段,包含一个key为menuFoodRelationVO的对象,该key的value中包含amount、secUnitDesc,
最后包含一个key为desc的字段。
JSON 格式的字符串是一种数据序列化的格式,用于数据的传输和存储,可以表示不同的数据结构,如对象、数组、字符串、数字等。在 Java 中,可以通过解析 JSON 字符串来得到对应的 JSON 对象
这里解释下,这个json字符串是我在ide中用输出函数打印的结果,真实网络传输中的json格式字符串是包含转义字符的,在控制台中打印JSON字符串时,通常会将其还原成原始的字符串形式,因此看不到转义字符。
转义字符 \ 是为了区分字符串中的特殊字符,如双引号 ", 换行符 \n, 制表符 \t 等。当我们直接打印一个字符串到控制台时,控制台会自动解析这些特殊字符,将其显示为其对应的字符,而不是转义字符本身。所以你在控制台打印看到的是字符本身,而不是转义字符。
将这个网络传输的字符串转换为java对象
先贴java对象的代码,
package com.chuyitech.gourmagic.device.vo;
import java.util.List;
/**
* Created by sjx on 4/18/23
* tuya食材表
*/
public class TuyaFoodInfoVo {
List<FoodLangInfoVO> foodLangInfoVOList;
MenuFoodRelationVO menuFoodRelationVO;
String desc; //补充说明
public List<FoodLangInfoVO> getFoodLangInfoVOList() {
return foodLangInfoVOList;
}
public void setFoodLangInfoVOList(List<FoodLangInfoVO> foodLangInfoVOList) {
this.foodLangInfoVOList = foodLangInfoVOList;
}
public MenuFoodRelationVO getMenuFoodRelationVO() {
return menuFoodRelationVO;
}
public void setMenuFoodRelationVO(MenuFoodRelationVO menuFoodRelationVO) {
this.menuFoodRelationVO = menuFoodRelationVO;
}
public String getDesc() {
return desc;
}
public void setDesc(String desc) {
this.desc = desc;
}
public class FoodLangInfoVO {
String name; //食材名
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "FoodLangInfoVO{" +
"name='" + name + '\'' +
'}';
}
}
public class MenuFoodRelationVO {
String amount; //食材数量
String secUnitDesc; //食材单位
public String getAmount() {
return amount;
}
public void setAmount(String amount) {
this.amount = amount;
}
public String getSecUnitDesc() {
return secUnitDesc;
}
public void setSecUnitDesc(String secUnitDesc) {
this.secUnitDesc = secUnitDesc;
}
@Override
public String toString() {
return "MenuFoodRelationVO{" +
"amount='" + amount + '\'' +
", secUnitDesc='" + secUnitDesc + '\'' +
'}';
}
}
@Override
public String toString() {
return "TuyaFoodInfoVo{" +
"foodLangInfoVOList=" + foodLangInfoVOList +
", menuFoodRelationVO=" + menuFoodRelationVO +
", desc='" + desc + '\'' +
'}';
}
}
注意上面的对象是这个json字符串(数组数据)的元素的java结构
特别注意:使用fastjson解析json字符串时,一定要把对应的java对象加上gettersetter方法,不然无法注入,同时为了方便输出控制台日志,建议同时加上toString方法
直接给出json字符串转换成java对象的代码:
List<TuyaFoodInfoVo> foodInfoVoList = JSONObject.parseArray(material, TuyaFoodInfoVo.class);
因为程序中的material就是本文开头传输的json字符串,这里我用手写一个相同的json字符串
String json = "[{\"foodLangInfoVOList\":[{\"name\":\"soli\"}],\"menuFoodRelationVO\":{\"amount\":\"14\",\"secUnitDesc\":\"łyżeczki\"},\"desc\":\"płaskie\"},{\"foodLangInfoVOList\":[{\"name\":\"wody\"}],\"menuFoodRelationVO\":{\"amount\":\"1500\",\"secUnitDesc\":\"null\"},\"desc\":\"null\"}]";
注意看,这是带转义字符的,json字符串都带转义字符,只不过控制台打印的时候给消除了!
插句题外话:当你要发送包含特殊字符的数据(如双引号)时,需要手动添加转义字符。这是因为网络传输过程中,数据会经过多个中间节点的解析和转发,如果不进行转义,就可能会导致数据的格式出现问题。
这里贴出该json字符串去除转义后的json.cn网站的输出(这时输出的其实就是个json对象了,json对象不带转义字符):
这里简单解释下json格式的字符串,json对象,java对象的区别?
答:我在我以前写的文章里面写了互转方式,这里提下区别:
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,它由键值对组成,可以表示简单的数据类型(如数字、字符串、布尔值、null)和复杂的数据类型(如数组、对象等)。JSON格式的字符串是一个字符串,遵循特定的语法规则,可以被解析成JSON对象。
JSON对象是指通过JSON格式的字符串解析出来的,具有键值对的属性和方法的JavaScript对象,它可以通过JavaScript的语法来操作和处理。
Java对象是指Java语言中定义的类的实例对象,具有类的属性和方法,可以通过Java的语法来操作和处理。通常在Java中,我们可以使用第三方库(如fastjson、gson等)将JSON格式的字符串转换成Java对象,或者将Java对象转换成JSON格式的字符串。
简单来说,JSON格式的字符串是一种表示数据的字符串格式,JSON对象是通过解析JSON格式的字符串而得到的JavaScript对象,Java对象是Java语言中定义的类的实例对象。我们可以使用相应的方法将它们之间相互转换,以达到数据处理和交换的目的。
这里继续用fastjson举个三者转换的小例子:
public class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
从Java对象转换成JSON格式的字符串:
Person person = new Person("John", 30);
String jsonString = JSON.toJSONString(person);
System.out.println(jsonString); // 输出:{"age":30,"name":"John"}
从JSON格式的字符串转换成JSON对象:
String jsonString = "{\"age\":30,\"name\":\"John\"}";
JSONObject jsonObject = JSON.parseObject(jsonString);
System.out.println(jsonObject.getString("name")); // 输出:John
从JSON对象转换成Java对象:
JSONObject jsonObject = JSON.parseObject("{\"age\":30,\"name\":\"John\"}");
Person person = JSON.toJavaObject(jsonObject, Person.class);
System.out.println(person.getName()); // 输出:John
最后举个使用json.cn网站的注意事项
json.cn网站转换json对象(内部结构是对象)
json.cn网站转换json对象(内部结构是数组)
注意注意,上述左边的一定得是个json对象(包括数组,只要符合json对象格式就行)才能转换成右边的json对象,如果左边的多了任何符号什么的只要不符合json格式都转换不成功,如果左边的带了转义字符也转换不成功,所以一般操作是直接把接口传输过来的网络数据打印在控制台(控制台会自动消除转义字符,消除后的字符串其实就是符合json格式了),然后拷贝到json.cn网站的左边,就能清晰看到右边的json对象了,然后再设计java对象。