barbitoff programmer`s blog

Здесь я публикую заметки из программерской жизни: грабли, на которые мне случилось наступить, проблемы, для которых было найдено элегантное (или не очень) решение, а также все, с чем мне пришлось столкнуться и чем хотелось бы поделиться =)
PS Если хотите меня поблагодарить - на странице есть 3 места, чтобы это сделать =)
Показаны сообщения с ярлыком JSON. Показать все сообщения
Показаны сообщения с ярлыком JSON. Показать все сообщения

понедельник, 27 марта 2023 г.

Grafana Loki: фильтрация по полю из JSON

 Если в Grafana Loki необходимо выполнить поиск по одному из полей JSON-лога, то делается это следдующим образом:

Сначала достаем поле из JSON и делаем из него лэйбл, затем добавляем фильтрацию по этому лэйблу.

пятница, 6 декабря 2019 г.

SpringFox и Spring Boot 2.2.1

SpringFox версии 2.9.2 (самый актуальный релиз на 06.12.2019) несовместима со Spring Boot 2.2.0 и выше из-за изменения API Spring, используемого SpringFox. На это заведен тикет https://github.com/springfox/springfox/issues/2932, однако, на текущий момент SpringFox 3.0.0-SNAPSHOT из основной ветки разработки так и не переведен на актуальный Spring Boot.
Поэтому пришлось форкнуться и внести необходимые корректировки самостоятельно: https://github.com/barbitoff/springfox/tree/2.9.2-boot-2.2.1. На первый взгляд - работает, но тесты из swagger-contract-tests пришлось проигнорировать, т.к. они падали. Однако, падали они и в оригинальной 2.9.2.

вторник, 17 апреля 2012 г.

JSON POST запросы к Redmine REST API

Проблема:

При выполнении POST-запроса в JSON-формате к Redmine REST API сервер ведет себя так, как будто не воспринимает тело запроса. Например, при попытке добавить Issue возвращается ошибка 404, а в логах Redmine видно:
Processing IssuesController#create to json (for 192.168.10.156 at 2012-04-17 13:59:05) [POST]
  Parameters: {"format"=>"json", "action"=>"create", "controller"=>"issues"}
Filter chain halted as [:find_project] rendered_or_redirected.
Completed in 47ms (View: 0, DB: 10) | 404 Not Found [http://redmine-tp/issues.json]
, хотя передаваемый идентификатор проекта 100% верен (существует в таблице "projects" в БД Redmine). При этом в заголовке Content-Type запроса указывается вроде бы корректное значение "text/json"; при попытке указать неверное "text/xml" возвращается вообще 500 ошибка, а в логи валится:

/!\ FAILSAFE /!\  Tue Apr 17 14:13:38 +0400 2012
  Status: 500 Internal Server Error
  undefined method `name' for nil:NilClass
    /usr/lib/ruby/gems/1.8/gems/activesupport-2.3.14/lib/active_support/xml_mini/rexml.rb:29:in `merge_element!'
    /usr/lib/ruby/gems/1.8/gems/activesupport-2.3.14/lib/active_support/xml_mini/rexml.rb:18:in `parse'
    /usr/lib/ruby/gems/1.8/gems/activesupport-2.3.14/lib/active_support/xml_mini.rb:12:in `__send__'
...
    /usr/lib/ruby/1.8/phusion_passenger/abstract_server.rb:196:in `start_synchronously'
    /usr/lib/phusion_passenger/passenger-spawn-server:61

Причина:

Неверно установлен заголовок Content-Type запроса. Вместо "text/json" необходимо использовать "application/json".

вторник, 27 декабря 2011 г.

JavaScript: сериализация объекта в строку в формате JSON

Преобразование объекта в JSON-строку осуществляется теми же библиотеками, что и парсинг строки в объект. например, http://www.json.org/js.html или, при работе с YUI, - YAHOO.lang.JSON. Метод, сериализирующий объекты называется и там, и там одинаково - stringify:
var serialisedData = YAHOO.lang.JSON.stringify(dataObj);
Обе библиотеки позволяют явно задать список полей, подлежащих сериализации, или функцию для предобработки значений перед сериализацией. 

понедельник, 26 декабря 2011 г.

Работа с JSON в Java

Если в Java требуется работать с форматом JSON (например, на JSP странице для отправки данных JavaScript-скрипту), то можно воспользоваться очень удобной библиотекой - org.json (http://www.json.org/java/). Библиотека позволяет быстро создавать строки  с JSON-данными, парсить строки с JSON-данными в Java-объекты, и даже преобразовывать XML в JSON. Например:

JSONObject myObj = new JSONObject();
myObj.put("key1", "val1");
myObj.put("key2", "val2");
myObj.put("key3", "val3");
JSONArray myArr = new JSONArray();
myArr.put("a");
myArr.put("b");
myArr.put("c");
myObj.put("key4",myArr);
System.out.println(myObj.toString());
выведет:

{"key4":["a","b","c"],"key3":"val3","key2":"val2","key1":"val1"}
И наоборот:
String jsonStr = "{\"key4\":[\"a\",\"b\",\"c\"],\"key3\":\"val3\",\"key2\":\"val2\",\"key1\":\"val1\"}";
JSONObject myParsedObj = new JSONObject(jsonStr);
JSONArray myParsedArr = (JSONArray)myParsedObj.get("key4");
System.out.println(myParsedArr.get(2));
выведет символ "c".
Метод XML.toJSONObject(String) разбирает переданный XML и преобразует его естественным образом в JSON (вложенные теги становятся вложенными объектами, несколько соседних тегов с одним именем превращаются в массив), так, например, вызов:
System.out.println(XML.toJSONObject("<a><b>1</b><b>2</b><b>3</b><c><d>45</d></c></a>").toString());
выдаст:
{"a":{"b":[1,2,3],"c":{"d":45}}}
Также возможно и обратное преобразование.
Для представления NULL в методах put используется JSONObject.NULL.

Объекты JSONObject можно конструировать из любых объектов, поддерживающих интерфейс Map<K,V>, а JSONArray - List<T>.

пятница, 1 апреля 2011 г.

Выполнение JSONP-запросов в jQuery


JSONP - полезный подход для выполнения кроссдоменных асинхронных запросов, позволяющий обойти изместно ограницение XMLHTTPRequest. Смысл его заключается в добавлении на страницу тега <script>, загружающего данные формата JSON со стороннего домена:
<script src="/some/crossdomain/url/here" type="text/javascript"></script>

Полученный код должен содержать нечто вроде:
var data = {one : "12", two : "34"}
someCallback(data);

, где someCallback() - функция, которая должна обработать полученный JSON.

Чтобы получатель запроса знал, какую именно функцию написать вместо someCallback, имя функции должно передаваться в тексте запроса, например: URL_запроса?callback=myCallBack.

Но это всё теория, и если пользоваться jQuery, всё оказывается намного проще:

$.getJSON(crossdomainRequestUrl, function(data) { ... })


, где crossdomainRequestUrl должен заканчиваться на "&callback=?". Конечный знак вопроса укажет jQuery, что выполняется JSONP зарпос. При этом имя callback-функции указывать не нужно. Полученный JSON будет передан, как обычно, в обработчик, заданный вторым параметром $.getJSON. На серверной части значение параметра callback, которое будет сформировано jQuery самостоятельно, нужно исопльзовать как имя callback функции, вызов которой нужно вставить в выдаваемый в ответ JS-скрипт.