Cjson格式解析与接入AI大模型
JSON格式的解析与构造
- 基本概念
JSON是JavaScript Object Notation的简称,中文含义为“JavaScript 对象表示法”,它是一种数据交换的文本格式,而不是一种编程语言。
JSON 是一种轻量级的数据交换格式,采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。
当今互联网时代,JSON 已经成为了各种应用程序之间数据交换和通信的主流格式。它易于阅读和编写,并且易于机器解析和生成,常在Web开发中用于数据的格式化和传输。
- 数据格式
- 对象
JSON 由两种数据结构组成:对象和数组。对象(object)是由键值对组成的无序集合,键是字符串,值可以是任何类型,包括对象和数组。对象由一对花括号{ }包围,键和值之间用冒号:分隔。键值对之间用逗号,分隔。
假设想要以JSON格式记录天气现象文字、天气现象代码、温度(单位为c摄氏度或f华氏度)。
{
"text" : "多云", //天气现象文字
"code": "4", //天气现象代码
"temperature": "14", //温度,单位为c摄氏度或f华氏度
}
- 数组
JSON 由两种数据结构组成:对象和数组。数组(array)是值(value)的有序集合,每个值可以是任何类型,包括对象和数组。数组由一对方括号[ ]包围,值之间用逗号,分隔。
[ "apple", "banana", "orange"]
在上面的例子中,可以看到数组包含三个字符串元素,分别是:"apple"、"banana"和"orange"。
注意:键的值有多种类型,值(value)可以是花括号{ }括起来的字符串(string)、数值(number)、布尔值(true/false)、 null、对象(object)或者数组(array),并且这些结构可以嵌套。
{
“name” : ”lmx”,
“age” : 30,
“score” : {
“C” : 65.0,
“linux”: 80.5
},
“sex” : “man”
}
提示:JSON格式本质也是字符串,只不过字符串中存储的数据需要按照JSON格式进行构造。
- 解析方法
一般嵌入式开发中可以使用cJSON库对JSON格式进行解析,cJSON库是基于C语言的一个开源项目,github下载地址:https://github.com/DaveGamble/cJSON
cJSON库主要的文件有两个:一个是cJSON.c 一个是cJSON.h。使用时在工程中包含头文件即可,在cJSON.h头文件中有一个用于解析JSON格式的结构体,如下:
- 解析JSON流程
- 想要解析JSON格式,前提是得到存储了JSON数据的字符串,一般就是HTTP的请求或者响应的时候,绝大多数的情况都是服务器响应的数据为JSON格式。
- 需要把存储了JSON数据的字符串进行转换,转换JSON格式,此时可以通过cJSON库中README.md来分析,可以知道调用 cJSON_Parse() 进行解析,该函数的返回值就是cJSON格式的数据。
- 如果得到了转换成功的JSON格式的字符串,可以对该字符串进行调试输出,可以选择调用cJSON_Print(),该函数的返回值就是存储了JSON格式的字符串,如下:
- 如果输出结果没有问题,则可以开始对JSON数据进行解析,其中可以先从JSON对象中获得某个键的值,相当于对某个键值对进行解析,注意:如果键值对的值的类型不是字符串、整型、浮点型,则需要继续对键值对进行解析。否则,可以直接输出键值对的内容,利用JSON对象的结构体指针cJSON *的成员valuestring、valueint、valuedouble。
- 如果键值对的类型不是基本类型,而是对象或者数组,则需要继续解析,此时分为两种情况,第一种是情况:键值对的值的类型是对象,此时可以选择继续调用cJSON_GetObjectItem()函数。
- 如果键值对的类型不是基本类型,而是对象或者数组,则需要继续解析,此时分为两种情况,第一种是情况:键值对的值的类型是数组,此时可以选择调用cJSON_GetArraySize()函数,该函数的作用是获取数组中的元素的数量。另外,可以选择调用cJSON_GetArrayItem()函数,可以获取数组中的元素,如果数组的元素类型是对象,则可以选择调用cJSON_GetObjectItem()函数对对象进行解析。
- 代码案例
- 构造JSON流程
- 如果打算构造JSON格式,则需要首先创建一个JSON顶层对象,需要调用cJSON_CreateObject(),也就是该函数可以创建对象,其实就是构造一对{ }。
- 可以选择继续调用cJSON_CreateObject()来创建新的小对象,此时可以选择向小对象中添加键值对,添加键值对的前提是构造键值对,需要先把键值对的值添加到创建的对象中,再把小对象添加到其他对象中,具有嵌套关系。根据键值对的值的类型,可以选择调用。
- AI大模型的接入与应用
目前的AI大模型的种类较多,一般可以选择接入目前比较主流的大模型,本次就以字节跳动旗下的火山引擎发布的豆包大模型为例,学习如何通过HTTP协议在线接入AI大模型。
- 注册账号
- 账号认证
- 选择产品
- 选择模型
- 分析模型
- 开通服务
作业:首先需要注册一个账号,然后申请开通某个模型的服务,然后阅读模型的API调用文档。
- 获取密钥
注意:API_KEY是很重要的,是作为HTTP的请求的鉴权信息使用,需要作为HTTP的Authorization请求字段使用。
请求头部字段结构: Authorization: Bearer 6d4d987a-d792-43ae-8571-806b02792838\r\n
- 请求参数
可以知道,如果想要接入AI大模型,需要使用HTTP服务,并且需要构造HTTP的请求,请求需要包含以上2个参数。
- model
是必填项,需要填入接入点的ID,格式一般可以参考官方提供的接入案例,具体的流程如下:
- messages
是必填项,需要填写消息的对话列表,是固定的格式,其中需要包含role和content,如下
role指的是角色,分为system和user,system指的是豆包大模型,user指的是用户,大模型和用户需要分别输入对应的对话内容。
对于system的content指的是提供给大模型的提示词,对于user的content指的是提供给大模型的对话内容。
注意:豆包大模型的HTTP的请求参数是以JSON格式进行构造的,所以可以参考接入示例:
{
"model": "doubao-1-5-lite-32k-250115",
"messages": [
{
"role": "system",
"content": "你是人工智能助手."
},
{
"role": "user",
"content": "常见的十字花科植物有哪些?"
}
]
}
- 接入方式
可以知道豆包大模型可以采用HTTP的POST请求来进行对话,由于使用的是主流的HTTP/1.1的协议版本,支持长连接,但是如果打算在请求中包含请求body的话,一般是需要在构造HTTP请求的时候使用头部字段Content-Length : xxx xxx是一个整数,用于记录数据长度
一般HTTP/1.1的协议版本中,客户端和服务器都需要指定请求体/响应体的长度,方便双方读取指定长度的数据。
- 程序设计
- 响应格式
- 运行效果
练习:自己选择豆包大模型,利用HTTP协议进行接入,要求可以通过键盘实现对话,并且要求利用cJSON库对服务器的响应体进行解析,把服务器响应的内容输出到终端。