JSON получить пролог предикат
Я пытаюсь создать этот предикат в прологе:
Предикат
json_get/3
можно определить как:json_get(JSON_obj, Fields, Result).
что верно, когдаResult
можно восстановить, следуя цепочке полей вFields
(список), начиная сJSON_obj
, Поле, представленноеN
(сN
старшее число o, равное 0) соответствует индексу массива JSON.
Пожалуйста, помогите мне понять, чтобы следовать цепочке полей.
Спасибо
edit1:
Конечно, объект json выглядит так: "{name": "Aretha", "фамилия": "Franklin"} ". если я вызову предикат json_parse для этого объекта, пролог покажет мне это
json_obj([(”name”, ”Aretha”), (”surname”, ”Franklin”)])
мы называем это объект O
,
с json_get
мне нужно извлечь из O имя таким образом, 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 ответ
Как насчет этого
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
в nth0/3
.)