Я работаю над простой веб-службой в Prolog и хочу ответить на мои пользователи данными, отформатированными как JSON. Хорошим средством является reply_json_dict/1
, который принимает словарь и преобразует его в ответ HTTP с хорошо отформатированным корпусом JSON.с использованием словарей в swi-prolog
Моя проблема заключается в том, что создание самого словарного слова ответа кажется немного громоздким. Например, когда я возвращаю некоторые данные, у меня есть идентификатор данных, но может/не иметь свойств данных (возможно, несвязанной переменной). На данный момент я делаю следующее:
OutDict0 = _{ id : DataId },
(nonvar(Props) -> OutDict1 = OutDict0.put(_{ attributes : Props }) ; OutDict1 = OutDict0),
reply_json_dict(OutDict1)
, который работает отлично, поэтому выход является { "id" : "III" }
или { "id" : "III", "attributes" : "AAA" }
в зависимости от того или не связан Props
, но ... Я ищу более простой подход. В первую очередь потому, что если мне нужно добавить несколько дополнительных пар ключ/значение, я в конечном итоге с несколькими последствиями, как:
OutDict0 = _{ id : DataId },
(nonvar(Props) -> OutDict1 = OutDict0.put(_{ attributes : Props }) ; OutDict1 = OutDict0),
(nonvar(Time) -> OutDict2 = OutDict1.put(_{ time : Time }) ; OutDict2 = OutDict1),
(nonvar(UserName) -> OutDict3 = OutDict2.put(_{ userName : UserName }) ; OutDict3 = OutDict2),
reply_json_dict(OutDict3)
И это кажется просто неправильно. Есть ли более простой способ?
Приветствия, Яцек
Хорошо, что вы решили это с помощью этих входов! Вопрос все еще как-то остается: зачем даже создавать dict, когда у вас уже есть список, который вам нужен? Учтите, что каждый раз, когда вы используете dict, это делает ваше приложение менее портативным, потому что dicts не являются стандартной функцией Prolog ... – mat
Хорошая точка зрения, хотя я в меньшей степени обеспокоен мобильностью на данный момент. Самое приятное в том, что он держит ключи уникальными, поэтому сопоставление объектов JSON более естественно. Обратите внимание: несмотря на то, что стандарт JSON позволяет использовать не-уникальные ключи, многие библиотеки этого не делают, поэтому лучше сохранить их уникальными. – Jacek
Вам не нужна скобка вокруг «Key = Value» в первом аргументе вашего 'findall'. –