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

Crystal应用中JSON::Serializable反序列化PascalCase属性问题求助

Crystal 处理PascalCase JSON属性的反序列化方案

核心问题分析

你遇到的两个关键问题:

  1. Crystal 不允许属性名以大写字母开头,直接写property PropertyOne : String会触发语法错误
  2. JSON::Serializable默认会将类属性名映射为同名字符串(如propertyOne对应JSON的propertyOne),但API返回的是PropertyOne,因此需要显式指定键映射。

方案一:单个字段显式映射(推荐少量字段场景)

将类属性改为Crystal合法的标识符(推荐用snake_case,也支持小写开头的camelCase),然后通过@[JSON::Field]注解指定对应的PascalCase键名:

class PascalCaseResponse
  include JSON::Serializable

  # 用snake_case属性名,映射到JSON的PropertyOne
  @[JSON::Field(key: "PropertyOne")]
  property property_one : String

  @[JSON::Field(key: "SomeOtherProperty")]
  property some_other_property : String

  @[JSON::Field(key: "WhereAreTheCamels")]
  property where_are_the_camels : String
end

如果偏好camelCase属性名,也可以这样写:

class PascalCaseResponse
  include JSON::Serializable

  @[JSON::Field(key: "PropertyOne")]
  property propertyOne : String

  @[JSON::Field(key: "SomeOtherProperty")]
  property someOtherProperty : String

  @[JSON::Field(key: "WhereAreTheCamels")]
  property whereAreTheCamels : String
end

方案二:全局映射(推荐多类/多字段场景)

如果多个类需要处理PascalCase的JSON响应,可以自定义序列化模块,自动完成snake_case属性名到PascalCase键名的转换:

# 自定义PascalCase序列化模块
module PascalCaseSerializable
  include JSON::Serializable

  # 重写字段名映射逻辑:snake_case -> PascalCase
  def self.json_field_name(attr_name : String)
    attr_name.split('_').map(&.capitalize).join
  end
end

然后在响应类中引入这个模块即可,无需逐个字段加注解:

class PascalCaseResponse
  include PascalCaseSerializable

  # 直接用snake_case属性名,自动映射到PascalCase的JSON键
  property property_one : String
  property some_other_property : String
  property where_are_the_camels : String
end

验证代码

修改后的解析代码无需改动,直接使用PascalCaseResponse.from_json即可正常反序列化:

api_url = "api.notmyapi.com"
client = HTTP::Client.new(api_url)
params = "/api?lets-get-some-pascal-case-i-guess"

json_response = PascalCaseResponse.from_json(client.get(params).body)
puts "json_response = #{json_response}" # 正常输出

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 06:24:59