Crystal handle json文件,格式已知,但具有动态键

Crystal handle json文件,格式已知,但具有动态键,json,crystal-lang,Json,Crystal Lang,因此,我有一个JSON文件,它的格式有些已知,{String=>JSON::Type,…}。因此,它基本上属于Hash(String,JSON::type)类型。但是当我尝试将它从文件读入内存时,比如:JSON.parse(file.read(@cache_file)).as(Hash(String,JSON::Type))我总是会遇到一个异常:无法将JSON::Any转换为Hash(String,JSON::Type) 如果我不能转换数据,我不确定该如何处理它 我基本上想做的是: 在字符串键

因此,我有一个JSON文件,它的格式有些已知,
{String=>JSON::Type,…}
。因此,它基本上属于Hash(String,JSON::type)类型。但是当我尝试将它从文件读入内存时,比如:
JSON.parse(file.read(@cache_file)).as(Hash(String,JSON::Type))
我总是会遇到一个异常:
无法将JSON::Any转换为Hash(String,JSON::Type)

如果我不能转换数据,我不确定该如何处理它

我基本上想做的是:

  • 在字符串键下保存JSON::Type数据
  • 将JSON::Type数据替换为字符串键下的其他JSON::Type数据
当然,从文件读取/写入

到目前为止,我得到的全部信息如下:

class Cache
  def initialize(@cache_file = "/tmp/cache_file.tmp")
  end

  def cache(cache_key : (String | Symbol))
    mutable_cache_data = data
    value = mutable_cache_data[cache_key.to_s] ||= yield.as(JSON::Type)
    File.write @cache_file, mutable_cache_data
    value
  end

  def clear
    File.delete @cache_file
  end

  def data
    unless File.exists? @cache_file
      File.write @cache_file, {} of String => JSON::Type
    end
    JSON.parse(File.read(@cache_file)).as(Hash(String, JSON::Type))
  end
end

puts Cache.new.cache(:something) { 10 } # => 10
puts Cache.new.cache(:something) { 'a' } # => 10

TL;DR我想将一个JSON文件读入一个散列(String=>I\u dont\u care),替换给定键名下的一个值,然后再次将其序列化到文件中。我该怎么做呢?

JSON.parse
返回一个,而不是一个散列,因此不能强制转换它。但是,您可以访问底层原始值作为
JSON.parse(file).raw,并将其转换为哈希


然后您的代码基本上正常工作(我已经修复了一些错误):

JSON.parse
返回一个,而不是一个散列,因此您不能强制转换它。但是,您可以访问底层原始值作为
JSON.parse(file).raw,并将其转换为哈希


然后您的代码基本上正常工作(我已经修复了一些错误):

您可以使用
散列(String,JSON::Type)。从\u JSON(File.read(@cache\u File))
。希望您可以将
JSON::type
的类型限制为更合理的类型<与使用
Hash
Array
和使用
JSON.mapping
的自定义类型表示模式相比,任何
JSON.parse_raw
都是最后的选择。您可以使用
散列(字符串,JSON::Type)。从\u JSON(File.read(@cache\u File))
。希望您可以将
JSON::type
的类型限制为更合理的类型
JSON::Any
JSON.parse_raw
与使用
Hash
Array
表示模式和使用
JSON.mapping
自定义类型相比,几乎是最后的选择。还有JSON.parse_raw(文件)啊,还有JSON.parse_raw(文件)