Есть ли способ декодировать JSON, который имеет номера в строковом формате? - PullRequest
1 голос
/ 05 ноября 2019

У меня есть файл json, в котором все целые числа и числа с плавающей точкой представлены в виде строк: [{"x": "123.45", "stuff": "things"}] Я пытался выяснить, есть ли простой способ прочитать его и декодировать в словарь таким образом, чтобывсе строки чисел преобразуются обратно в числа: {"x": 123.45, "stuff": "things"} Я думал, что JSONDecoder должен иметь эту возможность, но я не могу понять это. Я попытался установить parse_float=Decimal, но, похоже, это ничего не дало. У кого-нибудь есть идеи без создания совершенно новой функции?

Ответы [ 2 ]

0 голосов
/ 05 ноября 2019

Хорошо, так что из-за отсутствия лучшей опции, и потому, что я не хотел функцию, которая выдает исключения, я сделал следующее:

def change_type(file):
    def to_num(match):
        return ast.literal_eval(match.group())

    data = open(file).read()[1:-1]
    p = re.compile(r'\"([-+]?\d*\.\d+|\d+)\"')
    data_json = loads(p.sub(to_num, data))
    return data_json

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

Принимает test.json, то есть [{"x": "123.45", "stuff": "things"}] и возвращает {'x': 123.45, 'stuff': 'things'}.

0 голосов
/ 05 ноября 2019

Ниже приведен пример, вы можете попробовать

Примечание: используйте isdigit (), чтобы проверить, является ли его целое число.

нет isFloat (), поэтому создали простую функцию isFloat ()чтобы проверить число с плавающей запятой

def isFloat(string):
    try:
        float(string)
        return True
    except ValueError:
        return False


example = {"x":"123.45",
             "y":"120"}

for key, value in example.items():
    if value.isdigit():
        example[key]=int(value)
    elif isFloat(value):
        example[key]=float(value)


print (example)

вывод: {'x': 123.45, 'y': 120}

...