JSON

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,常用于将数据从服务器传输到Web应用程序。它基于JavaScript语法,但可以被多种编程语言解析和生成。

JSON使用键值对的方式来表示数据,其中键是字符串,值可以是字符串、数字、布尔值、数组、对象或null。它的语法简洁明了,易于阅读和编写,并且广泛应用于Web开发、API设计和数据交互等领域。

以下是JSON的一个示例:

  1. {
  2. "name": "icheima",
  3. "age": 30,
  4. "city": "Shenzhen"
  5. }

在许多编程语言中,可以使用内置的函数或库来解析JSON字符串并将其转换为相应的数据结构,以便进行操作和处理。

cJSON

cJSON是一个使用C语言编写的JSON数据解析器,具有超轻便,可移植,单文件的特点,使用MIT开源协议。
cJSON项目托管在Github上,仓库地址如下:

  1. https://github.com/DaveGamble/cJSON

学习使用它非常的简单, 下面我们以一个简单的例子演示
发送数据:

  1. char payload[256] = "{\"id\":\"161848123\",\"version\":\"1.0\",\"params\":{\"PowerSwitch\":%d,\"CurrentTemperature\":%f},\"method\":\"thing.event.property.post\"}";
  2. char sendbuf[256];
  3. sprintf(sendbuf,payload,1,66.6);
  4. bsp_usart_dma_send_string((uint8_t *)sendbuf);

接收数据处理:

  1. /**
  2. {"method":"thing.service.property.set","id":"1579746008","params":{"PowerSwitch":1},"version":"1.0.0"}
  3. */
  4. cJSON *json = cJSON_Parse(data);
  5. if (json) {
  6. cJSON *method = cJSON_GetObjectItem(json, "method");
  7. cJSON *id = cJSON_GetObjectItem(json, "id");
  8. cJSON *params = cJSON_GetObjectItem(json, "params");
  9. cJSON *version = cJSON_GetObjectItem(json, "version");
  10. cJSON *icheima_mqtt_connect = cJSON_GetObjectItem(json, "icheima_mqtt_connect");
  11. if (method && id && params && version) {
  12. printf("Method: %s\n", method->valuestring);
  13. printf("ID: %s\n", id->valuestring);
  14. cJSON *powerSwitch = cJSON_GetObjectItem(params, "PowerSwitch");
  15. if (powerSwitch && cJSON_IsNumber(powerSwitch)) {
  16. printf("PowerSwitch: %d\n", powerSwitch->valueint);
  17. }
  18. cJSON *currentTemperature = cJSON_GetObjectItem(params, "CurrentTemperature");
  19. if (currentTemperature && cJSON_IsNumber(currentTemperature)) {
  20. printf("currentTemperature: %f\n", currentTemperature->valuedouble);
  21. }
  22. printf("Version: %s\n", version->valuestring);
  23. }
  24. cJSON_Delete(json);
  25. } else {
  26. printf("JSON parsing failed.\n");
  27. }

python接收数据

  1. import serial
  2. import time
  3. import json
  4. # 打开串口
  5. ser = serial.Serial("COM23",baudrate=115200)
  6. data=None
  7. while True:
  8. n = ser.in_waiting
  9. if n > 0:
  10. temp = ser.read(ser.in_waiting)
  11. if data:
  12. data = data + temp
  13. else:
  14. data = temp
  15. d = data.decode()
  16. try:
  17. js = json.loads(d)
  18. print(f"type={type(d)},data={d}")
  19. print(js["params"]['CurrentTemperature'])
  20. except Exception as e:
  21. pass
  22. else:
  23. # print(n)
  24. data=None
  25. pass
  26. time.sleep(0.1)