json得到prolog谓词

时间:2018-01-08 15:46:49

标签: json prolog swi-prolog

我试着在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"]))]).

1 个答案:

答案 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。)