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 相同的状态,否则解析器将处于无效状态。