【问题标题】:Is there a way to decode json that has numbers in string format?有没有办法解码具有字符串格式数字的json?
【发布时间】:2019-11-05 18:40:08
【问题描述】:

我有一个 json 文件,其中所有整数和浮点数都表示为字符串: [{"x": "123.45", "stuff": "things"}] 我一直在试图弄清楚是否有一种简单的方法可以将其读入并解码成字典,从而使所有数字字符串都转换回数字:{"x": 123.45, "stuff": "things"} 我认为 JSONDecoder 应该具有此功能,但我似乎无法弄清楚。我试过设置parse_float=Decimal,但这似乎没有任何作用。 有没有人在不创建全新功能的情况下有任何想法?

【问题讨论】:

  • 没有 JSON 解码器可以知道哪些字符串应该是浮点数,哪些应该是字符串。您必须自己明确地将您知道应该是浮点数的特定键转换为浮点数。
  • @deceze,哦,这可能是可以接受的,因为键应该始终相同。您介意发布一个答案,说明如何做到这一点吗?我在哪里指定一个总是浮点数或整数的键列表?或者你的意思是像做一个单独的函数来做到这一点?
  • 看看这个问题:stackoverflow.com/questions/45068797/… 我猜你需要的是 json.loads(c, object_hook=_decode)

标签: python json python-3.x decode


【解决方案1】:

下面是一个例子,你可以试试

注意:使用 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}

【讨论】:

    【解决方案2】:

    好的,因为没有更好的选择,而且我不想要一个抛出异常的函数,所以我就是这样做的:

    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'}

    【讨论】:

      猜你喜欢
      • 2011-06-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-01
      • 2021-06-04
      • 2013-07-05
      • 2018-06-02
      • 2012-06-12
      相关资源
      最近更新 更多