【问题标题】:Generate predicates from Json从 Json 生成谓词
【发布时间】:2017-01-14 02:18:34
【问题描述】:

我有一个在 Asp.Net 中完成的 WEB API,它返回 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).

【问题讨论】:

  • SWI-Prolog 有一个 json 包,如果你正在使用那个实现的话。

标签: asp.net json asp.net-web-api prolog swi-prolog


【解决方案1】:

如何访问无类型内容的示例:

:- 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).

【讨论】:

  • CapelliC 感谢您的回答。当我尝试您的代码时,我收到此错误: 错误:apply:maplist_/3: Undefined procedure: (>>)/4 Exception: (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 你觉得你能帮我理解吗?
  • 该错误是由 library(yall) 引起的,它是一个 lambda 实用程序,已在相对较新的版本中实现。我将显示等效的纯代码...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多