Prolog Json处理

时间:2017-01-09 23:30:38

标签: json prolog

server():- http_server(http_dispatch, [port(45000)]).

serverTest(Request):-http_read_json(Request, JSONIn),
  json_to_prolog(JSONIn, PrologIn), format(PrologIn) .

我有这个Prolog程序,但我无法很好地处理PrologIn变量。我收到这个错误:

Type error: `text' expected, found `json([id=3])'

我知道这意味着我不能将格式 PrologIn 一起使用,但如何处理内部信息呢?意思是,如何提取“id = 3”信息?

修改

这是完整的程序

(如果我使用了足够多的模块,是因为我正在使用该程序做其他事情并且没有过滤到这个特定情况)

:- use_module(library(http/thread_httpd)). 
:- use_module(library(http/http_dispatch)).
:- use_module(library(http/http_parameters)). 
:- use_module(library(http/http_ssl_plugin)).
:- use_module(library(http/http_open)).
:- use_module(library(http/http_client)).
:- use_module(library(http/http_json)).
:- use_module(library(http/json)).

:- http_handler('/test', serverTest, []).

其余是编辑前的前两个预测

我通过首先进入Prolog的控制台并输入“server()。”来测试它,这将启动服务器。然后我按以下方式使用Postman:选择 POST ,在标题中,键是 Content-Type ,其值为 application / json ,然后,在Body中,我选择 raw (JSON(application-json))并将其写在文本区域中:

{
  "id" : 3
}

这是我测试它的方式,我希望能够处理prolog谓词(serverTest)中的id = 3信息。

2 个答案:

答案 0 :(得分:4)

您确实需要显示完整的程序,如何启动服务器以及如何查询它。否则,人们只能猜测。

无论如何,这个问题很少:format(PrologIn)

首先,正如程序告诉你的那样,这是一个术语。并format格式化输出。至少,你必须写:

format("~w", [PrologIn])

请参阅documentation on format/2,基本上,如果您的字词如下:json([id=3]),则应该打印json([id=3])

现在接下来的问题:这会打印到哪里?使用HTTP包库启动服务器时,会重定向输入和输出,以便您可以读取请求并写入响应。库文档中有许多示例。

然后接下来的事情:你是如何得到3的。如果您另外加载http_json plugin module

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

然后你可以直接使用,如代码示例所示,

http_read_json_dict(Request, DictIn)

现在DictIn是一个“dict”,可能看起来像这样:_{id:3}。请参阅documentation on dicts

不必使用dicts,只需使用正常模式匹配和列表处理检查json术语。对于某些用例,Dicts更容易(例如,更少打字)。

修改

这是一个适用于我的最小示例。这是服务器代码:

:- use_module(library(http/thread_httpd)). 
:- use_module(library(http/http_dispatch)).
:- use_module(library(http/http_json)).

:- http_handler('/test', test, []).

server :-
    http_server(http_dispatch, [port(45000)]).

test(Request) :-
    http_read_json_dict(Request, JSON),
    format(user_error, "~w~n", [JSON.id]).

从顶层开始,在查阅文件后,我运行:

?- server.
% Started server at http://localhost:45000/
true.

此时,我使用另一个命令行中的curl:

$ curl -H "Content-Type: application/json" -d '{"id":3}' http://localhost:45000/test
curl: (52) Empty reply from server

我在服务器运行的Prolog toplevel上打印出3:

?- 3

这当然不理想,所以我用以下内容替换服务器代码中的最后一行:

reply_json(_{foobar:JSON.id}).

然后在服务器运行的Prolog toplevel上,我使用make/0

?- make.
% Updating index for library .../lib/swipl-7.3.35/library/
% ... compiled 0.00 sec, 0 clauses
true.

现在,当我再次使用curl时:

$ curl -H "Content-Type: application/json" -d '{"id":3}' http://localhost:45000/test
{"foobar":3}

这就是你所需要的!

答案 1 :(得分:0)

我不知道您的Prolog网络库,但我猜测http_read_json已将其第二个参数绑定到Prolog术语,因此调用json_to_prolog是不必要且不正确的

尝试

serverTest(Request) :- http_read_json(Request, JSONIn), format(JSOnIn).

如果要将ID号与收到的ID隔离开来,可能就像

一样简单
serverTest(Request) :- http_read_json(Request, json([id=X])),
     % ... do something with X value here ... %