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的区别:

getLonggetLongValue 在 fastjson 中有一些区别:

  1. getLong(String key):

    • 这个方法会返回 Long 类型的对象。如果指定的 key 对应的值为 null,则返回 null

    • 示例:

      Long value = jsonObject.getLong("key");

  1. 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 中,数据可以以不同的结构存在,主要有以下两种种类型:

  1. JSON 对象(使用大括号 {}):

    • 格式:{"key": "value"}{"key1": "value1", "key2": "value2"}

    • 示例:{"name": "John", "age": 30}

  2. 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示例中:

  1. 使用 JSONObjectJSONArray 类来解析JSON字符串。

  2. 通过 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的大写首字母变成小写。

可以使用这两个注解解决