我试着在prolog中创建这个谓词:
谓词
json_get/3
可以定义为:json_get(JSON_obj, Fields, Result).
当Result
可通过以下方式恢复时为真 从Fields
开始的JSON_obj
(列表)中的字段链。一个字段 由N
表示(N
,主要数字o等于0)对应于 JSON数组的索引。
请帮助我理解遵循这一领域的链条。
谢谢
EDIT1:
当然,所以json对象看起来像这个'{“name”:“Aretha”,“surname”:“Franklin”}'。 如果我把json_parse谓词调用到这个对象prolog告诉我这个
json_obj([(”name”, ”Aretha”), (”surname”, ”Franklin”)])
,我们称之为obj O
。
json_get
我需要以这种方式从名称中提取名称json_get(O, ["name"], R)
EDIT2:
在某人的帮助下,这就是现在的谓词:
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"
,但谓词不会提取字段并失败。
EDIT3:
这是json_parse的输出
json_obj([("nome", "Zaphod"), ("heads", json_array(["Head1", "Head2"]))]).
答案 0 :(得分:1)
这个怎么样
$
这会在您的第二个示例中生成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).
而不是Head1
。如果你不是只打错字,请解释一下这应该是怎么回事。 (如果它从零开始,您只需将Head2
更改为nth1/3
。)