Обнуляемость наследуется от исходного столбца.
Вы можете потерять или получить обнуляемость с помощью выражения:
Пример (константные литералы кажутся проблематичными - нужна хорошая функция 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
Боюсь, что в библиотеке simplejson нет способа достичь этого автоматически.
Сканер и декодер в simplejson предназначены для создания текста в формате Unicode. Для этого библиотека использует функцию под названием c_scanstring
(если она доступна, для скорости) или py_scanstring
, если версия C недоступна. Функция scanstring
вызывается несколько раз почти каждой подпрограммой, которая есть в simplejson для декодирования структуры, которая может содержать текст. Вам нужно будет либо обезьяно исправить значение scanstring
в simplejson.decoder, либо подкласс JSONDecoder
и предоставить в значительной степени свою собственную полную реализацию всего, что может содержать текст.
Причина то, что simplejson выводит Unicode, однако, заключается в том, что в спецификации json конкретно упоминается, что «Строка представляет собой набор из нуля или более символов Unicode» ... поддержка Unicode предполагается как часть самого формата. Реализация строки сканирования Simplejson заходит так далеко, что позволяет сканировать и интерпретировать escape-последовательности Unicode (даже проверку ошибок для искаженных представлений многобайтовой кодировки), так что единственный способ надежно вернуть вам значение - это использовать кодировку unicode.
Если у вас есть устаревшая библиотека, которой требуется str
, я рекомендую вам либо кропотливо поискать во вложенной структуре данных после синтаксического анализа (что Я признаю, что вы прямо сказали, что хотите избежать ... извините), или, возможно, оберните свои библиотеки каким-то фасадом, где вы можете массировать входные параметры на более детальном уровне. Второй подход может быть более управляемым, чем первый, если ваши структуры данных действительно глубоко вложены.
Это потому, что 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']
Это поздно для игры, но я построил рекурсивный заклинатель. Это работает для моих нужд, и я думаю, что это относительно полно. Это может вам помочь.
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)
Я использую его как закрытый член класса, но вы можете изменить назначение метода по своему усмотрению.
Итак, я столкнулся с той же проблемой. Угадайте, что было первым результатом 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