罕用成分的JSON表示法,及其切换到ISON表示法
罕用成分的JSON表示法,及其切换到ISON表示法
2026-3-21
我有一个配方管理工具是自己写的, 一般而言, 配方数据库需要一个比较灵活的存储不常用成分的机制,比如这个数据库中, 固定的成分名有65种,预留的还有7个字段,尽管有这72种可用,但可能出现的品种总有新的,比如临时加入的添加剂,特殊比例的锂盐溶液(作为一种新成分来使用),或者某些微量的除水添加剂等. 光是72个固定字段是不够的,为了应付这种情况,我在数据库中设计了代理字段9个,然后配置一个文本字段, 在文本中存贮这些代理字段中各成分的含量、缩写、CAS号信息,如AGENT、AGENT2到AGENT9等. 这样一共就有了81个字段.
那么,这个文本字段应该采取哪种结构来存储这些信息呢?之前经过选择比较,XML格式因为有文本中有很多标签,加上没有小巧的解析模块,没有考虑. CSV格式因为某些信息中会有逗号而容易导致歧义也没有考虑, 试验几回之后, 我感觉JSON语法是比较好的结构化数据描述语言,它有很好的扩展能力,同时也比较直观.因此经过一番努力,采用了 JSON. 在需要代理的成分信息存入数据库之前,将配方中所有成分扫描一遍,如果不在上述的65种固定字段之内(7个保留的字段暂未启用,待后来有物质变成常用时再改名为某一成分),则将它的含量依次放到AGENT..AGENT9这几个字段中,同时生成一段符合JSON规范的文本将它保存到AGENTDATA字段中去.比如某个配方中有这样的记录:

具体的作法就是扫描出所有需要代理的成分,将要保存的信息添加到一个python的字典中,然后利用orjson模块的dumps函数,将这个字典转化为字符串,然后存放到数据库的AgentData字段中,相应的Agent字段下则存贮了这个成分的含量信息.
当配方读出时,则扫描数据库中这65个固定字段和9个代理字段段是否是空值.如果不是空值就把它读出来.将名称与含量一一对应起来, 放到EXCEL的表格中.如果是AGENT数据呢,则还需要利用orjson将字符串转化成一个结构化的字典,根据AGENT的名称找出对应成分的含量再填写到EXCEL表格的对应位置即可.
这个机制工作得还是很完善的,没有出过错.但我不太满意的就是AGENTDATA中存贮的文本比较难看,JSON规范对格式的正确性要求又很高,稍微少个双引号就是出问题. 整个字串中充斥着大量的双引号,很不整洁.
最近注意到ISON这种格式,可以大量减少JSON中的双引号,是为了AI处理数据而设计的,因为减少了大量的双引号,可以十分显著的节约TOKEN. 它用来代替JSON在这里表达AGENT信息, 我想应该也是可行的.于是学习研究了一下.
举例来说,上面的数据,如果转化成ISON文本就是下面这样的

这里有一点与规范的ISON不同的是,ISON中用的是换行符'\n',但这个转义字串经EXCEL单元格接收再转存到HDF格式的数据库中时,导致数据库的文件格式损坏了,我只好把'\n'用 '#D#A'替换了.
(这里面有个小插曲,测试时我把换行符写入到了数据库记录,结果下一秒再打开数据库就显示出错了.后来只好用UltraEdit把数据库文件打开,发现里面的换行符是二进制0A,我尝试把它手动把三处0A修改成30(即数字0的文本),再重新打开数据库文件就好了,避免了一次数据损失)
与JSON相比,ISON文本更加简洁.但表达的方式稍有差异, JSON用花括号表示不同的包含关系, 对文本形式的KEY:VALUE大量使用花括号,增加了很多麻点. ISON则很像结构化数据库的记录,上面是字段名清单,接下来是一个接一个的记录.不过上例只有一条记录 . 不同的字段之间是用空格分隔的.
有人会问,如果文本中包含了空格或一些特殊符号怎么办呢?这种情况下文本需要用双引号包围起来,但与其它字段的数据仍是用空格分隔.(当然,也可以指定不同的分隔符).

ISON 读出来之后,我用replace直接把'#D#A'替换成'\n',再用loads将文本转化成结构化的文档,将需要的信息读出来就可以轻松使用了.
总体来看,从ISON模块的安装到使用都是比较简单的.详细的ISON语法可以看 这里. 但要注意的是,有些中文网早期对ISON介绍的例子,由于ISON模块的内部调整现在可能不能运行了,需要稍作调整.因此语法示例还是来官方网站看比较准确.(http://ison.dev)

浙公网安备 33010602011771号