我试图在prolog中创建这个谓词:
谓词
json_get/3
可以定义为:json_get(JSON_obj, Fields, Result).
当Result
可通过以下方式恢复时为 true。Fields
(列表)中的字段链(从JSON_obj
开始。一个字段 用N
表示(N
主数 o 等于 0)对应于 JSON 数组的索引。
请帮助我理解遵循字段链。
谢谢
编辑1:
当然,所以 json 对象看起来像这样 '{"name" : "Aretha", "surname" : "Franklin"}'。 如果我调用json_parse这个对象的谓词 Prolog 告诉我这个
json_obj([(”name”, ”Aretha”), (”surname”, ”Franklin”)])
,我们称之为 objO
。
有了json_get
我需要以这种方式从 O 中提取名称,json_get(O, ["name"], R)
编辑2:
在某人的帮助下,这是现在的谓词:
json_get(json_obj(JSON_obj), Field, Result) :-
memberchk((Field,Result), JSON_obj).
json_get(JSON_obj, Fields, Result) :-
maplist(json_get(JSON_obj), Fields, Result).
所以现在问题是嵌套列表。 例如,使用此输入
json_parse('{"nome" : "Zaphod",
"heads" : ["Head1", "Head2"]}', Z),
json_get(Z, ["heads", 1], R).
输出应该是R = "Head2"
但谓词不会提取字段并失败。
编辑3:
这是json_parse的输出
json_obj([("nome", "Zaphod"), ("heads", json_array(["Head1", "Head2"]))]).
这个怎么样
json_get(json_obj(Obj),[F|Fs],Res) :-
member((F,R),Obj),
json_get(R,Fs,Res).
json_get(json_array(Is),[N|Fs],Res) :-
nth1(N,Is,R),
json_get(R,Fs,Res).
json_get(Res,[],Res).
这会产生第二个示例中未Head2
Head1
。请解释一下这应该如何工作,如果你不只是打错字。(如果它是从零开始的,您可以将nth1/3
更改为nth0/3
。