Как преобразовать тип jsonb в PostgreSQL 9.4 в float

это из-за того, что объект неприемлем для 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
29
задан Clodoaldo Neto 18 July 2014 в 13:56
поделиться

5 ответов

Есть две операции для получения значения из JSON. Первый -> вернет JSON. Второй ->> вернет текст.

Подробности: Функции и операторы JSON

Try

SELECT (json_data->'position'->>'lat')::float + 1.0 AS lat
FROM updates
LIMIT 5
76
ответ дан Kurt Mueller 18 July 2014 в 13:56
поделиться

Согласно документации , есть также функции

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.

6
ответ дан Community 18 July 2014 в 13:56
поделиться

AFAIK, в Postgres нет преобразования json-> float, так что вы можете попробовать явное приведение (json_data->'position'->'lat')::text::float

4
ответ дан knitti 18 July 2014 в 13:56
поделиться

Вы должны преобразовать значение json в текст, а затем плавать.

Попробуйте это:

(json_data #>> '{field}')::float
1
ответ дан FelixSFD 18 July 2014 в 13:56
поделиться

Добавление пояснения, потому что это первое место в поиске «преобразования с плавающей запятой JSONB» - обратите внимание, что вам нужно заключить преобразование JSON в скобки, а , а затем применить приведение «::». .

Как упомянуто выше, правильный метод:

(json_data #>> '{field}')::float

Если вместо этого вы попробуете это, это потерпит неудачу:

json_data #>> '{field}'::float

Это была ошибка, которую я допустил в своем коде и мне потребовалось некоторое время, чтобы увидеть это - легко исправить, как только я это заметил.

3
ответ дан rocksteady 18 July 2014 в 13:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: