Crystal handle json文件,格式已知,但具有动态键
因此,我有一个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) 如果我不能转换数据,我不确定该如何处理它 我基本上想做的是: 在字符串键
{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(文件)