JSON转换
1.fastJson
1.1 json字符串---->java对象(或者JSONObject对象):JSONObject.parseObject()
JSON.parseObject(String text),只传入 json 字符串
JSON.parseObject(String text,Class<T> class),传入目标 Java 类的 Class 对象。这种写法可以将 json 字符串的值解析到返回的 class 对象上,并且只映射class 对象上有的字段,没有的字段则为 null。
String jsonString = "{\"name\":\"Alice\",\"age\":30}";
JSONObject jsonObject = JSONObject.parseObject(jsonString);
// 获取字段S
String name = jsonObject.getString("name");
int age = jsonObject.getIntValue("age");
// 修改字段
jsonObject.put("age", 31);1.2 java对象---->json字符串:
JSON.toJSONString(jsonObject)jsonObject.toJSONString()、
//toJSONString是静态方法
String jsonString = JSON.toJSONString(jsonObject)
//toJSONString是实例方法
JSONObject jsonObject = new JSONObject();
String jsonString = jsonObject.toString();1.2.1 注意:
如果JSONObject中某个属性为null,转换为字符串后该属性就没了。
1.3 修改Json:JSONObject.put("key","newValue")、replace()
//1. 对于已经存在的值,会进行覆盖更新
jsonObject.put("name", "John");
//2.
jsonObject.replace("age", 35);1.4 获取json对象的属性值 ,getLong和getLongValue的区别:
getLong 和 getLongValue 在 fastjson 中有一些区别:
getLong(String key):这个方法会返回
Long类型的对象。如果指定的 key 对应的值为null,则返回null。示例:
Long value = jsonObject.getLong("key");
getLongValue(String key):这个方法会返回基本数据类型
long。如果指定的 key 对应的值为null,它会返回0。示例:
long value = jsonObject.getLongValue("key");
总结:
getLong返回的是一个Long对象,可能为null。getLongValue返回的是基本类型long,对于null值会用0来代替。
选择哪个方法取决于你是否需要处理 null 值。如果你需要知道值是否存在或为 null,使用 getLong 更合适。如果你希望在值不存在或为 null 时使用一个默认的基础值,使用 getLongValue 更合适。
1.5 使用map初始化jsonobject
// 创建一个 HashMap
HashMap<String, Object> map = new HashMap<>();
map.put("name", "Alice");
map.put("age", 30);
map.put("city", "New York");
// 转换为 JSONObject
JSONObject jsonObject = new JSONObject(map);
// 转换为 JSON 字符串
String jsonString = jsonObject.toJSONString();1.6 存java对象 (List或者map)到json字符串中
JSONObject jsonObject = new JSONObject();
// 将 List<PrintOrder> 作为对象数组 添加到 key 为 "printOrder" 的字段中
jsonObject.put("printOrder", printOrders);
//将一个map作为 json对象存储到 jsonObject的data字段中
jsonObject.put("data",map)
// 将 JSONObject 转换为 JSON 字符串
return JSON.toJSONString(jsonObject);1.7 取出jsonobject中的list和java对象
SapApiParam sapParam = expansionJsonObject.getJSONObject("sapApiParam").toJavaObject(SapApiParam.class);
List<Long> accountIdList = expansionJsonObject.getJSONArray("accountIdList").toJavaList(Long.class);Json对象和Json数组的区别:
0. 总结,综述
0.1 json的格式
在 JSON 中,数据可以以不同的结构存在,主要有以下两种种类型:
JSON 对象(使用大括号
{}):格式:
{"key": "value"}或{"key1": "value1", "key2": "value2"}示例:
{"name": "John", "age": 30}
JSON 数组(使用方括号
[]):格式:
[value1, value2, value3]示例:
["item1", "item2", "item3"]
0.2 postman传参
Q:我在controller里面写的一个接口,post请求,传参是一个list列表,前段该怎么传参?如果我把这个list列表放进一个实体类对象又该怎么传参?在postman里面。
A:第一种,传递json数组:
["item1", "item2", "item3"]
第二种,传递json对象
{
"items": ["item1", "item2", "item3"]
}
1. JSON 对象
JSON 对象是一组键值对的无序集合。键是字符串,值可以是任意JSON数据类型,包括字符串、数字、布尔值、数组、对象或null。JSON对象使用大括号 {} 包围,键值对之间使用逗号 , 分隔,键和值之间使用冒号 : 分隔。
示例:
{
"name": "John",
"age": 30,
"isStudent": false,
"address": {
"street": "123 Main St",
"city": "New York"
},
"hobbies": ["reading", "traveling", "swimming"]
}
在这个示例中:
"name": "John"是一个键值对,键是"name",值是"John"。"age": 30是一个键值对,键是"age",值是30。"isStudent": false是一个键值对,键是"isStudent",值是false。"address"是一个嵌套对象,包含"street"和"city"两个键值对。"hobbies"是一个包含字符串的数组。
postman里测试:
来自公司经历,修改宿舍extra信息:
{
"extra":"{\"gridCode\":\"XHX627B021\",
\"numberOfBeds\":4,\"waterMeterAssetCode\":\"日志更新格式测试3\",\"electricityMeterAssetCode\":\"平平32平\"}"
}
2. JSON 数组
JSON 数组是值的有序集合。数组中的每个值可以是任意JSON数据类型,包括字符串、数字、布尔值、数组、对象或null。JSON数组使用方括号 [] 包围,值之间使用逗号 , 分隔。
示例:
[
{
"name": "John",
"age": 30
},
{
"name": "Jane",
"age": 25
},
{
"name": "Jim",
"age": 35
}
]
在这个示例中,这是一个包含三个对象的数组,每个对象都包含 "name" 和 "age" 键值对。
前后端传递Json数组:
后端可以定义一个List<Content> 进行接收,如果使用String类型可能会类型转换失败的错误。
JSON 对象和 JSON 数组的区别
结构:<u>JSON 对象使用大括号 </u>
{}<u>,而 JSON 数组使用方括号 </u>[]。内容:JSON 对象包含键值对,而 JSON 数组包含值的列表,这些值可以是对象、数组或其他JSON类型。
顺序:JSON 对象是无序的,键值对的顺序不重要;JSON 数组是有序的,元素的顺序很重要。
使用示例
下面是一个示例,展示了如何在Java中解析和使用JSON对象和数组:
JSON 字符串
{
"employees": [
{
"firstName": "John",
"lastName": "Doe"
},
{
"firstName": "Anna",
"lastName": "Smith"
},
{
"firstName": "Peter",
"lastName": "Jones"
}
]
}
Java 代码
import org.json.JSONArray;
import org.json.JSONObject;
public class Main {
public static void main(String[] args) {
String jsonString = """
{
"employees": [
{
"firstName": "John",
"lastName": "Doe"
},
{
"firstName": "Anna",
"lastName": "Smith"
},
{
"firstName": "Peter",
"lastName": "Jones"
}
]
}
""";
JSONObject jsonObject = new JSONObject(jsonString);
JSONArray employees = jsonObject.getJSONArray("employees");
for (int i = 0; i < employees.length(); i++) {
JSONObject employee = employees.getJSONObject(i);
String firstName = employee.getString("firstName");
String lastName = employee.getString("lastName");
System.out.println("Employee: " + firstName + " " + lastName);
}
}
}
在这个Java示例中:
使用
JSONObject和JSONArray类来解析JSON字符串。通过
getJSONArray方法获取数组,通过getJSONObject方法获取数组中的对象。
3) 通过 getString 方法获取对象中的属性值。
json编辑器:
jsoneditor,等在线json编辑器
https://www.bejson.com/jsoneditoronline/index.html
类型转换使用JSON作为中转:
List entityList = mesService.listProductionPlanMaterial()
List<ProductionPlanProcessItemDTO> mesItemList = JSON.parseArray(
JSON.toJSONString(entityList),
ProductionPlanProcessItemDTO.class);
将 entityList 转换为 JSON 字符串再解析为 mesItemList 的做法,主要是利用了 JSON 序列化和反序列化的便利性。在 Java 中,直接将一个对象列表转换为另一个类型的列表可能比较复杂,因为这涉及到对象的属性映射和类型转换。JSON 序列化和反序列化提供了一种简单而通用的方法来进行这种转换。
@JsonProperty @JSONField注解的作用
字段名称映射:
用于指定 Java 对象字段与 JSON 中键名之间的映射关系。
如果 Java 对象的字段名与 JSON 中的键名不一致,可以使用
@JsonProperty注解来指定映射关系。
区别:
@JsonProperty属于 Jackson 库。@JSONField属于 FastJson 库。
采坑记录:
JSON.toJSONString将key变成了首字母小写的问题
postman向后台传参,和后台java对象转json字符串时,会自动把属性key的大写首字母变成小写。
可以使用这两个注解解决