
插件开发过长中,无法避免JSON的序列化和反序列化。之前采用的是 SPS 开发的 JSON 库。
尽管之前使用它完美的处理过百度地图API返回的JSON,但是这次似乎有些翻车。反序列化时,偶尔的报错,面对庞大的源代码,也要头疼一下;而且,在反序列化时,往往“丢失”一部分JSON元素,使得插件的优化变得不那么优雅。
静下心,找到一个处理原生JSON对象的方法。制作了一个 JSONHelper 库。
Set Classlib To JSONHelper.VCX
*!* ==========================================
*!* JsonHelper 使用示例
*!* ==========================================
LOCAL loJson, loUser, lcJsonStr, lcOutput
* 1. 初始化工具类
m.loJson = CREATEOBJECT("JsonHelper")
* 2. 准备一段 JSON 字符串(模拟 API 返回)
TEXT TO m.lcJsonStr NOSHOW
{
"id": "b3ad4fd6-1fb9-49ba-bddc-0cb529965720",
"object": "chat.completion",
"created": 1774366871,
"model": "deepseek-chat",
"choices": [
{
"index": 0,
"message": {
"role": "assistant",
"content": "Hello! How can I assist you today? ??"
},
"logprobs": null,
"finish_reason": "stop"
}
],
"usage": {
"prompt_tokens": 10,
"completion_tokens": 11,
"total_tokens": 21,
"prompt_tokens_details": {
"cached_tokens": 0
},
"prompt_cache_hit_tokens": 0,
"prompt_cache_miss_tokens": 10
},
"system_fingerprint": "fp_eaab8d114b_prod0820_fp8_kvcache_new_kvcache"
}
ENDTEXT
* 3. 反序列化 (String -> Object)
m.loUser = m.loJson.Parse(lcJsonStr)
Clear
* 4. 序列化 (Object -> String)
? "序列化 -- 紧凑模式:"
?
? m.loJson.Stringify(m.loUser)
?
? "序列化 -- 格式化:"
?
? m.loJson.Stringify(m.loUser, .T.)
?
* 5. 读取数据
? "模型:" + m.loUser.model
? "内容:" + m.loUser.choices.item(0).message.content
? "token总数:" + Transform(m.loUser.usage.total_tokens)
? "提示词缓存:" + Transform(m.loUser.usage.prompt_tokens_details.cached_tokens)
? "指纹:" + m.loUser.system_fingerprint
输出:

完美!
原生JSON的序列化和反序列化;自动的字符转义和转码;越高的OS版本性能越好;VFP原生操作。
todo:从零构造JSON对象并进行序列化
如果你喜欢,可留言/私信/私聊,按原样有偿共享。