JSON получить пролог предикат

Я пытаюсь создать этот предикат в прологе:

Предикат json_get/3 можно определить как: json_get(JSON_obj, Fields, Result). что верно, когда Result можно восстановить, следуя цепочке полей в Fields (список), начиная с JSON_obj, Поле, представленное NN старшее число 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.)

Другие вопросы по тегам