Crystal 中自定义数据结构的 json 编解码
没文档
上图为煎蛋无聊图爬虫里的comment储存结构体,在编码为json时发现需要定义几个东西,如下:
对于想要编码成json的数据结构,都需要定义一个to_json(io)
然后返回编码后的String,这个方法在嵌套数据结构的时候会被自动调用
需要注意的是,String必须转码,不然生成的json一团糟。用to_json
方法就行(需要先require "json"
)
对于需要解码的,定义一个initialize(pull: JSON::PullParser)
同样也会被自动调用,具体写法就看上面图里的吧
或者看这里
新语言没文档是硬伤啊,上面这几行折腾了两小时才摸清楚,全靠看源码(还没定义转跳支持)
相比go的全用反射搞定,虽然用起来复杂了点,但是自由度更高
如果是简单的json结构,可以直接用JSON.parse
解码
但是里面的嵌套结构的类型还需要转换
require "json"
json = JSON.parse "{\"name1\":\"value1\", \"name2\":\"value2\"}"
exit unless json.is_a?(Hash(String, JSON::Type)) # 类型断言
pp json.is_a?(Hash(String, JSON::Type))
pp json.is_a?(Hash(String, String))
pp json["name1"].is_a?(String)
json.is_a?(Hash(String, JSON::Type)) = true
json.is_a?(Hash(String, String)) = false
json["name1"].is_a?(String) = true