前言
erlang 对 json 的解析是有自己的工具的,也就是 jsx,可以在 config 里面引入并使用。但是问题出现了,json 解析的时候,会完全完整地解析全部的结构,而有时候,我们会希望只解析最外层的结构。
举个栗子:
{"key":{"inner_key":"inner_value"}}
解析结果为:
#{<<"key">> => #{<<"inner_key">> => <<"inner_value">>} }
期望结果为:
#{<<"key">> => <<"{\"inner_key\":\"inner_value\"}">> }
实现方案
我在 jsx 本身提供的参数和 jsx 的相关文档中,没有发现能够实现这个操作的方法。这个应该是我的疏漏和能力有限,期待读者补足,我这里就介绍下自己的原始实现方法。
- 用处理 binary 的方式,获取 key 值对应的位置
binary:match(<<Key/binary, "\":">>, Data)
- 假设值是以中括号开始的,找到配对的中括号,大括号同理。找寻方法是设置记数 count,每找到一个 [{ 则 count + 1,找到一个 }] 则 count - 1, 等到值为0,则代表找到配对的符号。
- 考虑特殊情况
{"a":{"apple":{"taste":"deliciouos"}}, "apple":{"taste":"not beautiful"}}
要取 apple 的值,应该是 {"taste":"not beautiful"}, 但上述处理结果会是 {"taste":"deliciouos"}.在这里,用jsx的完全解析的方法,得到结果Map,当你获得数据后进行一次解析并校验一下是否和预定的结果Map一致,一致则代表成功,不一致,则在1的位置后面循环进行12操作。
网友评论