это из-за того, что объект неприемлем для jsp ... используйте его
, добавьте эту зависимость или любую другую переданную преобразованную строку json в jsp ...
, например добавьте это в pom
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.6.2</version>
</dependency>
и используйте такой код:
@RequestMapping(value="foobar.htm", method = RequestMethod.GET)
public @ResponseBody String getShopInJSON() {
Foo f = new Foo();
f.setX(1);
f.setY(2);
f.setDescription("desc");
return new Gson().toJson(f); //converted object into json string
}//return converted json string
Есть две операции для получения значения из JSON
. Первый ->
вернет JSON
. Второй ->>
вернет текст.
Подробности: Функции и операторы JSON
Try
SELECT (json_data->'position'->>'lat')::float + 1.0 AS lat
FROM updates
LIMIT 5
Согласно документации , есть также функции
jsonb_populate_record()
jsonb_populate_recordset()
, аналогичные их близнецам json (присутствует с стр. 9.3)
json_populate_record()
json_populate_recordset()
. тип строки Либо используйте тип строки существующей таблицы, либо определите ее с помощью CREATE TYPE
. Или замените временную таблицу ad hoc:
CREATE TEMP TABLE x(lat float);
Может быть одним столбцом или длинным списком столбцов.
Заполняются только те столбцы, где имя соответствует клавише в объекте json
. Значение приведено к типу столбца и должно быть совместимым, либо возникает исключение. Другие ключи игнорируются.
SELECT lat + 1 -- no need for 1.0, this is float already
FROM updates u
, jsonb_populate_record(NULL::x, u.json_data->'position')
LIMIT 5;
Использование неявного LATERAL JOIN
здесь.
Аналогично, используйте jsonb_populate_recordset()
, чтобы разложить массивы на несколько строк в каждой записи.
Это работает так же в Postgres 9.3 с json
. Есть дополнительное преимущество, что внутреннее приведение к / из text
не является необходимым для числовых данных в jsonb
.
AFAIK, в Postgres нет преобразования json-> float, так что вы можете попробовать явное приведение (json_data->'position'->'lat')::text::float
Вы должны преобразовать значение json в текст, а затем плавать.
Попробуйте это:
(json_data #>> '{field}')::float
Добавление пояснения, потому что это первое место в поиске «преобразования с плавающей запятой JSONB» - обратите внимание, что вам нужно заключить преобразование JSON в скобки, а , а затем применить приведение «::». .
Как упомянуто выше, правильный метод:
(json_data #>> '{field}')::float
Если вместо этого вы попробуете это, это потерпит неудачу:
json_data #>> '{field}'::float
Это была ошибка, которую я допустил в своем коде и мне потребовалось некоторое время, чтобы увидеть это - легко исправить, как только я это заметил.