【问题标题】:HJSON Will Only Parse Integers or 'null' ValuesHJSON 将仅解析整数或“空”值
【发布时间】:2021-11-26 21:55:14
【问题描述】:

我正在尝试将应该是 JSON 的内容解析为 Python 字典。但是,我正在使用的 JSON 文件不是有效的 JSON,因为键值对周围经常会缺少引号。 HJSON 似乎是我正在寻找的东西,但是如果我尝试传递除 null 或任何整数以外的任何值,我会发现它错误。

使用一些我必须使用的“JSON”值来玩弄它:

import hjson

# EXAMPLE 1
working = hjson.loads('{ date_closed: null }')  # <- THIS WORKS!
print(working)
OrderedDict([('date_closed', None)])

# EXAMPLE 2
works_too = hjson.loads('{ date_closed: 42 }')  # <- THIS WORKS!
print(works_too)
OrderedDict([('date_closed', 42)])

# EXAMPLE 3
not_working = hjson.loads('{ date_closed: yes }')  # <- ERRORS!

~/hjson/decoder.py in scanKeyName(s, end, encoding, strict)
    278 
    279         if ch == '':
--> 280             raise HjsonDecodeError("Bad key name (eof)", s, end);
    281         elif ch == ':':
    282             if begin == end:

HjsonDecodeError: Bad key name (eof): line 1 column 21 (char 20)

# EXAMPLE 4
# Using different key name
also_not_working = hjson.loads('{ date_opened: yes }')  # <- ERRORS with identical error message as above

# Different value name, showing it's not a 'key' error but a 'value' error
this_works = hjson.loads('{ date_opened: null }') # <- THIS WORKS!
print(this_works)
OrderedDict([('date_opened', None)])


# EXAMPLE 5
doesnt_work = hjson.loads('{ date_opened: None }')  # <- ERRORS with identical error message as above

  1. 错误消息似乎不正确。有问题的不是key name(因为同一个键有时会起作用),而是value name

  2. 似乎能够被 HJSON 解析的唯一值是整数(值 42 有效)和 null 值。

我在这里错过了什么?

【问题讨论】:

    标签: python json dictionary hjson


    【解决方案1】:

    我只是在摆弄这个并查看HJSON spec,并根据那里的示例(也在try 部分下),相信我想通了。它没有明确解释,如果我错了,有人可以纠正我,但看起来 HJSON 需要左大括号和右大括号 {} 在不同的行上;至少,这就是我认为 Python 实现所遵循的,无论如何。例如,这是一个简单的用法,我能够确认它似乎可以毫无问题地解析:

    print(hjson.loads('''
    {
      testing_123: hello world
    }
    '''))
    
    # now it works! prints out:
    #   OrderedDict([('testing_123', 'hello world')])
    

    所以在你的情况下,我想修复它的最简单方法(也就是说,如果你不想手动将大括号放在单独的行上)是创建一个包装函数loads,定义如下:

    import hjson
    
    
    def loads(string, decoder=hjson.loads):
        return decoder(string.replace('{', '{\n').replace('}', '\n}'))
    

    现在,我可以确认上述两种情况现在似乎都按最初预期解析:

    working_now = loads('{ date_closed: yes }')
    print(working_now)
    
    also_working = loads('{ date_opened: yes }')  # <- ERRORS with identical error message as above
    print(also_working)
    

    输出:

    OrderedDict([('date_closed', 'yes')])
    OrderedDict([('date_opened', 'yes')])
    

    【讨论】:

    • 感谢您抽出宝贵时间!这真的很有帮助。如果失败的原因是由于大括号在同一行,我仍然不清楚我上面的例子为什么工作或失败。他们的牙套都位于相同的位置,所以我不确定为什么有些通过而有些没有。
    • 是的,同意。例如,我也不清楚为什么具有空值的示例有效。也许值得在hjson 项目中打开一个问题,只是为了获得第二意见或只是为了澄清。
    猜你喜欢
    • 1970-01-01
    • 2011-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多