Unexpected ... 写入 Crystal JSON 转换器时意外的令牌异常
Unexpected ... Unexpected token exception when writing Crystal JSON converter
为什么使用此 JSON converter/parser 总是 导致异常 (Unexpected token: EOF at 1:98
)?
class MyParser
def self.from_json(value : JSON::PullParser) : String
"static"
end
# ...
end
class User
JSON.mapping(
first_name: {type: String, converter: MyParser},
last_name: {type: String, converter: MyParser}
)
end
JSON::PullParser
的使用总是需要您消耗一个完整的值。如果不想读取 json 值,可以使用 JSON::PullParser#skip
.
为了形象化这是为什么,请将 JSON::PullParser
视为 JSON 流中的游标。当调用 from_json
方法时,光标在流中的位置类似于 "key": |"value"
,其中 |
是光标位置(显然 "value"
可以是数组、另一个对象或任何事物)。如果您通过在 PullParser
上调用 read_string
来读取字符串,您将到达 "key": "value"|
并且游标已准备好读取 ,
然后是下一个对象键,或者 }
如果它是对象的末尾。如果您不想读取该值,则必须调用 skip
以达到与调用 read_string
相同的状态,否则解析器将处于无效状态。
为什么使用此 JSON converter/parser 总是 导致异常 (Unexpected token: EOF at 1:98
)?
class MyParser
def self.from_json(value : JSON::PullParser) : String
"static"
end
# ...
end
class User
JSON.mapping(
first_name: {type: String, converter: MyParser},
last_name: {type: String, converter: MyParser}
)
end
JSON::PullParser
的使用总是需要您消耗一个完整的值。如果不想读取 json 值,可以使用 JSON::PullParser#skip
.
为了形象化这是为什么,请将 JSON::PullParser
视为 JSON 流中的游标。当调用 from_json
方法时,光标在流中的位置类似于 "key": |"value"
,其中 |
是光标位置(显然 "value"
可以是数组、另一个对象或任何事物)。如果您通过在 PullParser
上调用 read_string
来读取字符串,您将到达 "key": "value"|
并且游标已准备好读取 ,
然后是下一个对象键,或者 }
如果它是对象的末尾。如果您不想读取该值,则必须调用 skip
以达到与调用 read_string
相同的状态,否则解析器将处于无效状态。