Racket读取JSON文件时hash-ref报错:找不到'foo'键对应值
Racket读取JSON时hash-ref找不到"foo"键的问题
我编写了如下Racket代码:
#lang racket (require json) (define test-json (read-json (open-input-string (file->string "test.json")))) (hash-ref test-json "foo")
对应的test.json内容为:
{ "foo":"bar", "bar":"baz" }
运行时出现错误:hash-ref: no value found for key, key: "foo",明明JSON文件中已为"foo"赋值,尝试多种导入JSON文件的写法仍出现相同错误,请问哪里操作有误?
问题原因与修复方案
问题核心是Racket的json库默认将JSON对象解析为不可变哈希(immutable-hash),而标准hash-ref默认仅支持可变哈希(hash类型),两者不兼容导致键查找失败。
有两种直接的修复方式:
方式1:适配不可变哈希的查找方法
改用支持不可变哈希的hash-ref调用,或者直接使用不可变哈希专属的查找函数:
; 方式1a:给hash-ref传入默认值,兼容不可变哈希 (hash-ref test-json "foo" #f) ; 方式1b:直接使用不可变哈希的查找函数 (immutable-hash-ref test-json "foo")
方式2:解析JSON时生成可变哈希
修改read-json的参数,让它直接生成可变哈希,这样原有的hash-ref就能正常工作:
(define test-json (read-json (open-input-string (file->string "test.json")) #:hash? #t))
你可以先打印test-json的类型验证问题:
(displayln (type-of test-json))
默认情况下会输出(Immutable-HashTable String Any),确认是不可变哈希类型。
内容的提问来源于stack exchange,提问作者yFlix
相关产品推荐
相关产品推荐

