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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 05:23:10