2017-01-14 23 views
1

У меня есть API-интерфейс WEB в Asp.Net, который возвращает некоторые точки интереса в JSON. В прологе я получить его, делая это:Создание предикатов от Json

poi(X):- http_client:http_get('http://localhost:XXXXX/api/PontosInteresse',X,[]). 

Это возвращает что-то в этом роде:

X = '[{"ID":1,"nome":"teste","descricao":"gfds","tempoEstimado":21,"acessibilidade":1,"localID":1,"local":{"ID":1,"nome":"porto","latitude":"21","longitude":"-21","ApplicationUserID":null},"categoriaID":1,"categoria":{"ID":1,"nome":"cultura","ApplicationUserID":null},"hashtags":null,"ApplicationUserID":null},{"ID":2,"nome":"teste2","descricao":"qweqwe","tempoEstimado":13,"acessibilidade":1,"localID":1,"local":{"ID":1,"nome":"porto","latitude":"21","longitude":"-21","ApplicationUserID":null},"categoriaID":1,"categoria":{"ID":1,"nome":"cultura","ApplicationUserID":null},"hashtags":null,"ApplicationUserID":null},{"ID":3,"nome":"teste3","descricao":"fgdfg","tempoEstimado":0,"acessibilidade":0,"localID":1,"local":{"ID":1,"nome":"porto","latitude":"21","longitude":"-21","ApplicationUserID":null},"categoriaID":1,"categoria":{"ID":1,"nome":"cultura","ApplicationUserID":null},"hashtags":null,"ApplicationUserID":null}]'. 

Как я могу преобразовать это в кучу предикатами, в виде:

poi(ID, Nome, Descricao, TempoEstimado, Acessibilidade, LocalId). 
local(ID, Nome, Latitude, Longitude). 
+0

Там в JSON пакет для SWI-Prolog, если вы используете это осуществление. –

ответ

2

пример того, как получить доступ к нетипизированным содержание:

:- use_module(library(http/json)). 

tj :- X = '[{"ID":1,"nome":"teste","descricao":"gfds","tempoEstimado":21,"acessibilidade":1,"localID":1,"local":{"ID":1,"nome":"porto","latitude":"21","longitude":"-21","ApplicationUserID":null},"categoriaID":1,"categoria":{"ID":1,"nome":"cultura","ApplicationUserID":null},"hashtags":null,"ApplicationUserID":null},{"ID":2,"nome":"teste2","descricao":"qweqwe","tempoEstimado":13,"acessibilidade":1,"localID":1,"local":{"ID":1,"nome":"porto","latitude":"21","longitude":"-21","ApplicationUserID":null},"categoriaID":1,"categoria":{"ID":1,"nome":"cultura","ApplicationUserID":null},"hashtags":null,"ApplicationUserID":null},{"ID":3,"nome":"teste3","descricao":"fgdfg","tempoEstimado":0,"acessibilidade":0,"localID":1,"local":{"ID":1,"nome":"porto","latitude":"21","longitude":"-21","ApplicationUserID":null},"categoriaID":1,"categoria":{"ID":1,"nome":"cultura","ApplicationUserID":null},"hashtags":null,"ApplicationUserID":null}]', 
    open_any(string(X), read, S, Close, []), 
    json_read(S, T), 
    Close, 
    maplist(convert, T, C), 
    maplist(writeln, C). 

convert(json(L), 
    poi(ID, Nome, Descricao, TempoEstimado, Acessibilidade, LocalId) 
    /local(IDLoc, NomeLoc, Latitude, Longitude) 
) :- 
    maplist({L}/[F,V]>>memberchk(F=V, L), 
     ['ID', nome, descricao, tempoEstimado, acessibilidade, localID], 
     [ID, Nome, Descricao, TempoEstimado, Acessibilidade, LocalId]), 
    memberchk(local=json(LL), L), 
    maplist({LL}/[F,V]>>memberchk(F=V, LL), 
     ['ID', nome, latitude, longitude], 
     [IDLoc, NomeLoc, Latitude, Longitude]). 

, что дает

poi(1,teste,gfds,21,1,1)/local(1,porto,21,-21) 
poi(2,teste2,qweqwe,13,1,1)/local(1,porto,21,-21) 
poi(3,teste3,fgdfg,0,0,1)/local(1,porto,21,-21) 

редактировать

здесь является эквивалентом кода, который позволяет избежать мощного library(yall)

convert(json(L), 
    poi(ID, Nome, Descricao, TempoEstimado, Acessibilidade, LocalId) 
    /local(IDLoc, NomeLoc, Latitude, Longitude) 
) :- 
    maplist(field_value(L), 
     ['ID', nome, descricao, tempoEstimado, acessibilidade, localID], 
     [ID, Nome, Descricao, TempoEstimado, Acessibilidade, LocalId]), 
    memberchk(local=json(LL), L), 
    maplist(field_value(LL), 
     ['ID', nome, latitude, longitude], 
     [IDLoc, NomeLoc, Latitude, Longitude]). 

field_value(Fields, Field, Value) :- 
    memberchk(Field=Value, Fields). 
+0

CapelliC благодарит за ответ. Когда я пытаюсь выполнить код, я получаю эту ошибку: ERROR: apply: maplist_/3: Неопределенная процедура: (>>)/4 Исключение: (13) >> ({['ID' = 1, nome = teste, descricao = gfds, tempoEstimado = 21, acessibilidade = 1, ... = ... | ...]}/[_ G2636, _G2639], memberchk (_G2636 = _G2639, ['ID' = 1, nome = teste, descricao = gfds , tempoEstimado = 21, acessibilidade = 1, localID = 1, ... = ... | ...]), 'ID', _G2616)? break Вы думаете, что можете помочь мне понять это? –

+1

ошибка вызвана библиотекой (yall), утилитой лямбда, которая была реализована в относительно новых версиях. Я покажу эквивалентный простой код ... – CapelliC