Как получить строковые объекты вместо Unicode от JSON?

Обнуляемость наследуется от исходного столбца.

Вы можете потерять или получить обнуляемость с помощью выражения:

Пример (константные литералы кажутся проблематичными - нужна хорошая функция NOOP, которая может возвращать NULL):

CREATE TABLE SO5465245_IN
    (
     a INT NOT NULL
    ,b INT NULL
    ) ;
GO

SELECT  COALESCE(a, NULL) AS a
       ,ISNULL(b, 0) AS b
       ,COALESCE(10, NULL) AS c1
       ,COALESCE(ABS(10), NULL) AS c2
       ,CASE WHEN COALESCE(10, NULL) IS NOT NULL THEN COALESCE(10, NULL) ELSE NULL END AS c3
INTO    SO5465245_OUT
FROM    SO5465245_IN ;
GO

SELECT  TABLE_NAME
       ,COLUMN_NAME
       ,IS_NULLABLE
FROM    INFORMATION_SCHEMA.COLUMNS
WHERE   TABLE_NAME LIKE 'SO5465245%'
ORDER BY TABLE_NAME
       ,ORDINAL_POSITION ;
GO

DROP TABLE SO5465245_IN ;
GO

DROP TABLE SO5465245_OUT ;
GO
272
задан martineau 29 October 2018 в 06:33
поделиться

4 ответа

Боюсь, что в библиотеке simplejson нет способа достичь этого автоматически.

Сканер и декодер в simplejson предназначены для создания текста в формате Unicode. Для этого библиотека использует функцию под названием c_scanstring (если она доступна, для скорости) или py_scanstring , если версия C недоступна. Функция scanstring вызывается несколько раз почти каждой подпрограммой, которая есть в simplejson для декодирования структуры, которая может содержать текст. Вам нужно будет либо обезьяно исправить значение scanstring в simplejson.decoder, либо подкласс JSONDecoder и предоставить в значительной степени свою собственную полную реализацию всего, что может содержать текст.

Причина то, что simplejson выводит Unicode, однако, заключается в том, что в спецификации json конкретно упоминается, что «Строка представляет собой набор из нуля или более символов Unicode» ... поддержка Unicode предполагается как часть самого формата. Реализация строки сканирования Simplejson заходит так далеко, что позволяет сканировать и интерпретировать escape-последовательности Unicode (даже проверку ошибок для искаженных представлений многобайтовой кодировки), так что единственный способ надежно вернуть вам значение - это использовать кодировку unicode.

Если у вас есть устаревшая библиотека, которой требуется str , я рекомендую вам либо кропотливо поискать во вложенной структуре данных после синтаксического анализа (что Я признаю, что вы прямо сказали, что хотите избежать ... извините), или, возможно, оберните свои библиотеки каким-то фасадом, где вы можете массировать входные параметры на более детальном уровне. Второй подход может быть более управляемым, чем первый, если ваши структуры данных действительно глубоко вложены.

или, возможно, оберните свои библиотеки в какой-то фасад, где вы можете массировать входные параметры на более детальном уровне. Второй подход может быть более управляемым, чем первый, если ваши структуры данных действительно глубоко вложены.

или, возможно, оберните свои библиотеки в какой-то фасад, где вы можете массировать входные параметры на более детальном уровне. Второй подход может быть более управляемым, чем первый, если ваши структуры данных действительно глубоко вложены.

9
ответ дан 23 November 2019 в 02:14
поделиться

Это потому, что json не имеет разницы между строковыми объектами и объектами Unicode. Это все строки в javascript.

Я думаю, JSON подходит для возврата объектов Unicode . На самом деле, я бы не принял ничего меньшего, поскольку строки javascript на самом деле являются объектами unicode (т. Е. Строки JSON (javascript) могут хранить любой unicode символ), поэтому имеет смысл создавать объекты unicode при переводе строк из JSON. Простые строки просто не подходят, так как библиотеке придется угадывать нужную кодировку.

Лучше использовать строковые объекты unicode везде. Поэтому лучше всего обновить библиотеки, чтобы они могли работать с объектами Unicode.

Но если вам действительно нужны строки байтов, просто закодируйте результаты в кодировку по вашему выбору:

>>> nl = json.loads(js)
>>> nl
[u'a', u'b']
>>> nl = [s.encode('utf-8') for s in nl]
>>> nl
['a', 'b']
37
ответ дан 23 November 2019 в 02:14
поделиться

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

def _parseJSON(self, obj):
    newobj = {}

    for key, value in obj.iteritems():
        key = str(key)

        if isinstance(value, dict):
            newobj[key] = self._parseJSON(value)
        elif isinstance(value, list):
            if key not in newobj:
                newobj[key] = []
                for i in value:
                    newobj[key].append(self._parseJSON(i))
        elif isinstance(value, unicode):
            val = str(value)
            if val.isdigit():
                val = int(val)
            else:
                try:
                    val = float(val)
                except ValueError:
                    val = str(val)
            newobj[key] = val

    return newobj

Просто передайте ему объект JSON следующим образом:

obj = json.loads(content, parse_float=float, parse_int=int)
obj = _parseJSON(obj)

Я использую его как закрытый член класса, но вы можете изменить назначение метода по своему усмотрению.

0
ответ дан 23 November 2019 в 02:14
поделиться

Итак, я столкнулся с той же проблемой. Угадайте, что было первым результатом Google.

Поскольку мне нужно передавать все данные в PyGTK, юникодовые строки мне тоже не очень нужны. Поэтому у меня есть еще один метод рекурсивного преобразования. На самом деле он также необходим для безопасного преобразования JSON - json.dump() будет отбрасывать любые нелитеральные данные, например, объекты Python. Однако он не преобразует индексы диктов.

# removes any objects, turns unicode back into str
def filter_data(obj):
        if type(obj) in (int, float, str, bool):
                return obj
        elif type(obj) == unicode:
                return str(obj)
        elif type(obj) in (list, tuple, set):
                obj = list(obj)
                for i,v in enumerate(obj):
                        obj[i] = filter_data(v)
        elif type(obj) == dict:
                for i,v in obj.iteritems():
                        obj[i] = filter_data(v)
        else:
                print "invalid object in data, converting to string"
                obj = str(obj) 
        return obj
1
ответ дан 23 November 2019 в 02:14
поделиться
Другие вопросы по тегам:

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