依赖
导入阿里的 fastjson 依赖。
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.78</version>
</dependency>
类型转换
String 与 JSON 相互转换
通过 JSONObject.parseObject(String str)
将字符串转换为 JSONObject 对象,此方法支持 JSON 字符串,JSON 字符串格式如下:
写法一:
{
"code":"1",
"status":"success",
"target":"年入百万",
"msg":{
"seq":"20230424",
"weather":"晴",
"salary":9000.00,
"job":"摆地摊"
},
"goods":{
"sum":2000.00,
"manufacturer":{
"address":"青口",
"boss":"张三"
},
"details":[
{
"name":"土豆",
"weight":"500斤"
},
{
"name":"豆腐",
"weight":"250斤"
}
]
}
}
写法二:
{"code":"1","status":"success","target":"年入百万","msg":{"seq":"20230424","weather":"晴","salary":9000.00,"job":"摆地摊"},"goods":{"sum":2000.00,"manufacturer":{"address":"青口","boss":"张三"},"details":[{"name":"土豆","weight":"500斤"},{"name":"豆腐","weight":"250斤"}]}}
转换案例代码:
String JSONstr1 = "{\n" +
"\t\"code\":\"1\",\n" +
"\t\"status\":\"success\",\n" +
"\t\"target\":\"年入百万\",\n" +
"\t\"msg\":{\n" +
"\t\t\"seq\":\"20230424\",\n" +
"\t\t\"weather\":\"晴\",\n" +
"\t\t\"salary\":9000.00,\n" +
"\t\t\"job\":\"摆地摊\"\n" +
"\t},\n" +
"\t\"goods\":{\n" +
"\t\t\"sum\":2000.00,\n" +
"\t\t\"manufacturer\":{\n" +
"\t\t\t\"address\":\"青口\",\n" +
"\t\t\t\"boss\":\"张三\"\n" +
"\t\t},\n" +
"\t\t\"details\":[\n" +
"\t\t\t{\n" +
"\t\t\t\t\"name\":\"土豆\",\n" +
"\t\t\t\t\"weight\":\"500斤\"\n" +
"\t\t\t},\n" +
"\t\t\t{\n" +
"\t\t\t\t\"name\":\"豆腐\",\n" +
"\t\t\t\t\"weight\":\"250斤\"\n" +
"\t\t\t}\n" +
"\t\t]\n" +
"\t}\n" +
"}";
String JSONstr2 = "{\"code\":\"1\",\"status\":\"success\",\"target\":\"年入百万\",\"msg\":{\"seq\":\"20230424\",\"weather\":\"晴\",\"salary\":9000.00,\"job\":\"摆地摊\"},\"goods\":{\"sum\":2000.00,\"manufacturer\":{\"address\":\"青口\",\"boss\":\"张三\"},\"details\":[{\"name\":\"土豆\",\"weight\":\"500斤\"},{\"name\":\"豆腐\",\"weight\":\"250斤\"}]}}";
JSONObject jsonObject1 = JSONObject.parseObject(JSONstr1);
JSONObject jsonObject2 = JSONObject.parseObject(JSONstr2);
System.out.println(jsonObject1);
System.out.println(jsonObject2);
输出:
如果是 JSONArray 类型的字符串,如下:
"details":[
{
"name":"土豆",
"weight":"500斤"
},
{
"name":"豆腐",
"weight":"250斤"
}
]
则需要用 JSONArray.parseArray()
将 JSON 转换为 String,使用 toJSONString()
,如下:
JSONObject jsonObject = new JSONObject();
jsonObject.toJSONString();
JSONObject.toJSONString(jsonObject);
JSONArray JSONArray = new JSONArray();
JSONArray.toJSONString();
JSONArray.toJSONString(JSONArray);
JSON 与 实体类
@Slf4j
public class Test2 {
public static void main(String[] args) {
String roleStr = "{\"name\":\"张三\",\"age\":7}";
Role role = JSONObject.parseObject(roleStr, Role.class);
log.info(role.toString());
log.info(role.getName());
}
}
@Data
@NoArgsConstructor
@AllArgsConstructor
class Role {
private String name;
private Integer age;
}
JSON 与 Map
Map<String, Object> map = new HashMap<>();
map.put("name", "张三");
map.put("age", 17);
JSONObject jsonObject = JSONObject.parseObject(JSONObject.toJSONString(map));
XML 与 Map 相互转换
https://blog.csdn.net/y1534414425/article/details/105770851
增删改查
获取数据
获取 JSONObject 数据:
根据 key 值获取对应的 value 数据。
// 获取 target 的值,返回 String
String target = jsonObject2.getString("target");
// 获取 code 的值,返回 Object
Object code = jsonObject2.get("code");
// 获取 msg 的值,返回 JSONObject
JSONObject msg = jsonObject2.getJSONObject("msg");
// 获取 details 的值,返回 JSONArray
JSONArray jsonArray = jsonObject2.getJSONObject("goods").getJSONArray("details");
注意:当要获取的数据不存在于 JSONObject ,获取到的对象为 null,单不会报 NullPointerException,如果继续对此 null 对象获取数据,会报 NullPointerException 。
获取 JSONArray 数据:
根据索引位置返回对象,索引下标从 0 开始。
// 获取索引为 0 处的 JSON 对象,返回 Object
Object o = jsonArray.get(0);
// 获取索引为 0 处的 JSON 对象,返回 JSONObject
JSONObject jsonObject = jsonArray.getJSONObject(0);
注意:如果要获取的数据不存在于 JSONArray 中,会报空指针。
移除数据
删除 JSONObject 中的数据:
// 删除指定的 key ,返回被删除的数据 Object
Object msg1 = jsonObject1.remove("msg");
// 当 code 的值为 2 的时候才删除,删除成功返回 true,否则返回 false
boolean code1 = jsonObject1.remove("code", "2");
注意:要移除的元素不在 JSONObject 中,并不会抛出异常。
删除 JSONArray 中的数据:可通过 jsonArray.size()
获取 JSONArray 中的 JSONObject 个数。
// 移除索引为 0 的 JSONObject
boolean remove1 = jsonArray.remove("0");
// 移除指定的 JSONObject
boolean remove = jsonArray.remove(jsonArray.getJSONObject(0));
List<JSONObject> jsonObjects = new ArrayList<>();
for (Object obj : jsonArray) {
jsonObjects.add((JSONObject) obj);
}
// 移除所有 JSONObject
boolean b = jsonArray.removeAll(jsonObjects);
注意:要移除的元素不在 JSONArray 中,并不会抛出异常。
新增数据
JSONObject 新增数据:
JSONObject jsonObject = new JSONObject();
// 插入 key-value ,如果已存在,则覆盖原来的 key 的 value,返回 Object
Object tip = jsonObject.put("tip", "脱下长衫,摆摊致富");
Map<String, Object> map = new HashMap<>();
map.put("name", "大学生");
map.put("major","通信工程");
map.put("age", 22);
// 插入 map
jsonObject.putAll(map);
// 插入 key-value ,如果 key 已存在,则插入失败且返回已有的 key-value
Object tip1 = jsonObject.putIfAbsent("tip", "摆摊摆摊,日赚九千");
// 将 map 作为 JSONObject 插入
jsonObject.put("map", map);
JSONArray 新增数据:类似于 JSONObject,不过是 <索引 + Object>,而JSONObject 是 <key-value> 。
注意:JSONArray 给同一索引插入两次 JSONObject ,效果如下:
修改数据
String str = "{\"code\":\"1\",\"status\":\"success\",\"target\":\"年入百万\",\"msg\":{\"seq\":\"20230424\",\"weather\":\"晴\",\"salary\":9000.00,\"job\":\"摆地摊\"},\"goods\":{\"sum\":2000.00,\"manufacturer\":{\"address\":\"青口\",\"boss\":\"张三\"},\"details\":[{\"name\":\"土豆\",\"weight\":\"500斤\"},{\"name\":\"豆腐\",\"weight\":\"250斤\"}]}}";
JSONObject jsonObject = JSONObject.parseObject(str);
// 替换对应 key 的 value
jsonObject.replace("code", 1);
JSONObject msg = jsonObject.getJSONObject("msg");
msg.replace("salary", 10000.00);
jsonObject.replace("msg", msg);
// 替换对应 key 的 oldValue 为 newValue,如果 oldValue 不存在,则不替换
jsonObject.replace("target", "年入十万", "年入千万");
注意:jsonObject 的 put(String key, Object value)
也能达到 replace 的效果。