【问题标题】:Python3 , Fixing JSON missing double quotes issuePython3,修复 JSON 缺少双引号问题
【发布时间】:2020-09-29 03:24:55
【问题描述】:

我正在 Python3 中运行一段代码,我正在使用来自源的 JSON 数据。我无法控制来源。在读取 json 数据时,我收到以下错误。 simplejson.errors.JSONDecodeError: Expecting property name enclosed in double quotes: line 1 column 2 以下是代码


import logging
import simplejson as json
logging.basicConfig(level=logging.INFO)


consumer = KafkaConsumer(
        bootstrap_servers='localhost:9092',        
        api_version=(1,0,0))

consumer.subscribe(['Test_Topic-1'])

for message in consumer:
    msg_str=message.value    
    y = json.loads(msg_str)
    print(y["city_name"])

由于我无法更改源,我需要在最后修复它。我发现这篇文章很有帮助,因为我的数据包含带有 : 的时间戳。

How to Fix JSON Key Values without double-quotes?

但我的 json 数据中的某些值也会失败,因为这些值中包含 :。例如address:"1600:3050:rf02:hf64:h000:0000:345e:d321"

有什么方法可以在我的 json 数据中的键上添加双引号?

谢谢。

【问题讨论】:

  • - 编辑了原始问题并添加了我正在使用的代码。
  • 您可以尝试使用模块dirtyjson - 它可以修复一些错误。
  • 您还没有向我们展示您的输入示例。无论如何,听起来你正在处理的不是 JSON

标签: python json python-3.x


【解决方案1】:

您可以尝试使用模块dirtyjson - 它可以修复一些错误。

import dirtyjson

d = dirtyjson.loads('{address:"1600:3050:rf02:hf64:h000:0000:345e:d321"}')

print( d['address'] )

d = dirtyjson.loads('{abc:"1:2:3:4", efg:"5:6:7:8", "hij":"foo"}')

print( d['abc'] )

它会创建AttributedDict,所以它可能需要dict() 来创建普通字典

d = dirtyjson.loads('{abc:"1:2:3:4", efg:"5:6:7:8", "hij":"foo"}')

print( d )

print( dict(d) )

结果:

AttributedDict([('abc', '1:2:3:4'), ('efg', '5:6:7:8'), ('hij', 'foo')])

{'abc': '1:2:3:4', 'efg': '5:6:7:8', 'hij': 'foo'}

【讨论】:

  • 成功了。感谢您推荐这个 python 包(dirtyjson)。我现在可以从 json 数据中读取密钥了。
【解决方案2】:

我认为你的问题是你有这样的字符串:

{abc:"1:2:3:4", efg:"5:6:7:8", "hij":"foo"}

不是有效的 JSON。您可以尝试使用正则表达式替换来修复它:

import re
jtxt_bad ='{abc:"1:2:3:4", efg:"5:6:7:8", "hij":"foo", klm:"bar"\n}'
jtxt = re.sub(r'\b([a-zA-Z]+):("[^"]+"[,\n}])', r'"\1":\2', jtxt_bad)

print(f'Original: {jtxt_bad}\nRepaired: {jtxt}')

这个的输出是:

Original: {abc:"1:2:3:4", efg:"5:6:7:8", "hij":"foo", klm:"bar"
}
Repaired: {"abc":"1:2:3:4", "efg":"5:6:7:8", "hij":"foo", "klm":"bar"
}

正则表达式\b([a-zA-Z]+):("[^"]+"[,\}])表示:边界,后接一个或多个字母,后接:,后接双引号字符串,后接,}\n之一。但是,如果字符串中有引号,例如"1:\"2:3",这将失败。

【讨论】:

    猜你喜欢
    • 2014-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-19
    • 2014-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多