You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Crystal语言使用UInt128字段时PullParser编译错误咨询

问题

在Crystal语言中创建包含UInt128类型字段_timestamp的可序列化类时,编译触发JSON::PullParser方法错误,错误信息如下:

$ crystal build src/myprogram.cr 
Showing last frame. Use --error-trace for full trace.

In /usr/lib/crystal/int.cr:1571:11

 1571 | value.to_u128
              ^------
Error: undefined method 'to_u128' for JSON::PullParser

将该字段改为UInt64类型时,编译错误消失。请问这是使用问题还是库的Bug?

相关代码示例:

require "json"

module Tb2md
  VERSION = "0.1.0"

  enum Priority
      Low # 1
      Medium # 2
      High # 3
  end

  class Entry
      include JSON::Serializable
      property _id : UInt32
      property _date : Time
      property _timestamp : UInt128
      property description : String
      property isStarred : Bool
      property boards : Array(String)
      property _isTask : Bool
      property isComplete : Bool
      property inProgress : Bool
      property priority : Priority
  end

  class Habitat
      include JSON::Serializable
      property entries : Hash(String, Entry)
  end

  content = File.open("storage.json") do |file|
      file.gets_to_end
  end

  h = Habitat.from_json(content)
  puts h
end

分析与解决

这是Crystal标准库JSON::Serializable的功能缺失,不属于你的使用问题。

Crystal的JSON序列化系统默认只对UInt64及以下的常见无符号整数类型提供了内置解析/序列化逻辑,UInt128作为更大的整数类型,标准库没有为JSON::PullParser实现对应的to_u128方法,导致编译失败。

解决方案

  1. 自定义解析转换器:为UInt128手动实现JSON序列化和解析逻辑,通过扩展规则解决:
require "json"

module UInt128JSON
  def self.from_json(pull : JSON::PullParser) : UInt128
    UInt128.new(pull.read_int.to_s)
  end

  def self.to_json(value : UInt128, json : JSON::Builder)
    json.number(value.to_s)
  end
end

class Entry
  include JSON::Serializable
  # 其他字段保持不变
  @[JSON::Field(converter: UInt128JSON)]
  property _timestamp : UInt128
end

这段代码通过自定义转换器,将JSON数字先读取为字符串再转换为UInt128,规避类型不兼容问题。

  1. 临时替代方案:如果业务场景允许,暂时用UInt64代替UInt128,可快速绕过该问题。

  2. 升级Crystal版本:若使用的是旧版本,可尝试升级到最新稳定版,确认官方是否已添加UInt128的JSON序列化支持。

内容的提问来源于stack exchange,提问作者somenxavier

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 09:50:23