iovxw

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

http://play.crystal-lang.org/#/r/3oo