【问题标题】:How can I parse this JSON data using str.replace?如何使用 str.replace 解析这个 JSON 数据?
【发布时间】:2017-12-15 02:11:06
【问题描述】:

更新

代码:

print('\n //// jsonData5 at the beginning:\n')
print(reply)
print(reply.__class__)

string2 = ''
string2 = reply.replace("\\", "")

print('\n //// string2:\n')
print(string2)

string1 = ''
for index, item in enumerate(res.decode()):
    string1 = string1 + item
    #string = string + item.decode()

string1 = string1.replace("'", "")
string1 = string1.replace("/", "")

print(string1)
jsonData6 = json.loads(string1)
jsonData8 = json.loads(string2)
res_loaded = jsonData8['res']
print('\n //// resloaded\n')
print(res_loaded['node'])

print('\n //// jsonData6[res]\n')
pprint(jsonData6)
print('\n //// jsonData5[res]\n')
pprint(jsonData5)
print('\n //// jsonData8[res]\n')
pprint(jsonData8['res']['node'])

输出:

//// jsonData5 at the beginning:

{"length": 106, "res": "{\"message\": \"New Block Forged\", \"index\": 106, \"transactions\": [{\"sender\": \"0\", \"recipient\": \"4a77509b1ca041d4b41e7983b6292691\", \"amount\": 1}], \"proof\": 299671, \"previous_hash\": \"3a83c09446911419318d671abb3de3523e32bc68dfea7b1a78eb9c459303c0ae\", \"node\": \"4a77509b1ca041d4b41e7983b6292691\"}"}
<class 'str'>

 //// string2:

{"length": 106, "res": "{"message": "New Block Forged", "index": 106, "transactions": [{"sender": "0", "recipient": "4a77509b1ca041d4b41e7983b6292691", "amount": 1}], "proof": 299671, "previous_hash": "3a83c09446911419318d671abb3de3523e32bc68dfea7b1a78eb9c459303c0ae", "node": "4a77509b1ca041d4b41e7983b6292691"}"}
{"message": "New Block Forged", "index": 112, "transactions": [{"sender": "0", "recipient": "433fc033fdb844aca7d28f93d26550af", "amount": 1}], "proof": 4940, "previous_hash": "86194415a7350a765a8917e2783872ce104f5724fd82ec3647ad8664147e1cc6", "node": "433fc033fdb844aca7d28f93d26550af"}
Traceback (most recent call last):
  File "alicep2p.py", line 121, in <module>
    jsonData8 = json.loads(string2)
  File "/home/pi/.pyenv/versions/3.6.3/lib/python3.6/json/__init__.py", line 354, in loads
    return _default_decoder.decode(s)
  File "/home/pi/.pyenv/versions/3.6.3/lib/python3.6/json/decoder.py", line 339, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
  File "/home/pi/.pyenv/versions/3.6.3/lib/python3.6/json/decoder.py", line 355, in raw_decode
    obj, end = self.scan_once(s, idx)
json.decoder.JSONDecodeError: Expecting ',' delimiter: line 1 column 27 (char 26)

这是一个与我看到的不同的错误,它不会加载它。

我有这个代码:

print('\n //// jsonData5 at the beginning:\n')
pprint(reply)
print(reply.__class__)

string2 = ''
string2 = reply.replace("'", "")
string2 = string2.replace('/', "")
string2 = string2.replace('(', "")
string2 = string2.replace(')', "")

print('\n //// string2:\n')
pprint(string2)

控制台输出为:

//// jsonData5 at the beginning:

('{"length": 48, "res": "{\\"message\\": \\"New Block Forged\\", \\"index\\": '
 '48, \\"transactions\\": [{\\"sender\\": \\"0\\", \\"recipient\\": '
 '\\"39ca48e4074e41c29374a4a59b1e0481\\", \\"amount\\": 1}], \\"proof\\": '
 '550305, \\"previous_hash\\": '
 '\\"cc64a8b99bc7be84261919159d456a19b204b3694388fe3fe203b0fc3c2d57d7\\", '
 '\\"node\\": \\"39ca48e4074e41c29374a4a59b1e0481\\"}"}')
<class 'str'>

//// string2:

('{"length": 48, "res": "{\\"message\\": \\"New Block Forged\\", \\"index\\": '
 '48, \\"transactions\\": [{\\"sender\\": \\"0\\", \\"recipient\\": '
 '\\"39ca48e4074e41c29374a4a59b1e0481\\", \\"amount\\": 1}], \\"proof\\": '
 '550305, \\"previous_hash\\": '
 '\\"cc64a8b99bc7be84261919159d456a19b204b3694388fe3fe203b0fc3c2d57d7\\", '
 '\\"node\\": \\"39ca48e4074e41c29374a4a59b1e0481\\"}"}')

字符串似乎没有任何反应——即使我使用replace() 函数更改它——我是 python 新手——我做错了什么?或者我如何将输出变成我可以访问的东西?

【问题讨论】:

  • 看起来您的替换确实有效,只是原始字符串中没有'/()。您看到的那些字符只是 pprint 方法在控制台中显示字符串的结果。实际数据从控制台中的第一个 { 开始,到最后一个 } 结束。
  • 谢谢...那么它是我应该能够与json.loads() 一起使用的字符串吗?那么转义字符呢?那些也是pprint?
  • 他们在工作,你只是被pprint() 的输出弄糊涂了。试试print(string2),你会发现一切正常。
  • @ewizard 它将与 json.loads 一起使用,但是您会发现生成的字典中将包含更多的 json 字符串,例如 "res" 的值是一个 json 字符串。
  • 我正在更新我的问题

标签: python string replace format tuples


【解决方案1】:

您是否正在尝试解析 JSON 数据?使用json 包。

>>> import json
>>> dict = json.loads('{"x":"y"}')
{u'x': u'y'}
>>>> json.dumps(dict)
'{"x": "y"}'

在您的示例中,您的数据是双重编码的,因此您需要对其进行两次解析:

import json
data = '{"length": 48, "res": "{\\"message\\": \\"New Block Forged\\", \\"index\\": 48, \\"transactions\\": [{\\"sender\\": \\"0\\", \\"recipient\\": \\"39ca48e4074e41c29374a4a59b1e0481\\", \\"amount\\": 1}], \\"proof\\": 550305, \\"previous_hash\\": \\"cc64a8b99bc7be84261919159d456a19b204b3694388fe3fe203b0fc3c2d57d7\\", \\"node\\": \\"39ca48e4074e41c29374a4a59b1e0481\\"}"}'
json.loads(json.loads(data)['res'])

你只是想replace特定字符吗?

>>> x = 'abca'
>>> print(x.replace('a', 'e'))
ebce

如果您对pprint 和其他转义字符感到困惑,请将其作为纯字节写入文件:

with open('out.dat', 'w') as f:
    f.write(my_string)

【讨论】:

  • 我试图删除 pprint 添加的内容,但不知道它是 pprint
  • 我需要替换转义字符{"length": 14, "res": "{\"message\": \"New Block Forged\", \"index\": 14, \"transactions\": [{\"sender\": \"0\", \"recipient\": \"4b9a0aa5bcec492db0fca93c4485258c\", \"amount\": 1}], \"proof\": 702791, \"previous_hash\": \"9e814c63ad3ae8094748778cd4c0921c252b2ee6a9c35cefb0767592b0718f75\", \"node\": \"4b9a0aa5bcec492db0fca93c4485258c\"}"} - 这些应该被我的替换去掉哦等等nm我用错了斜杠:)
  • ah - 您的字符串在 JSON 中是“双重编码”的。我更新了我的答案,向您展示如何加载它两次
  • 嗯,好吧,我试一试...我想我之前已经尝试过...我只是无法将其转换为 json 对象
  • 我如何解析两次?
猜你喜欢
  • 1970-01-01
  • 2022-12-02
  • 1970-01-01
  • 2015-12-12
  • 2018-12-29
  • 2016-05-22
  • 1970-01-01
  • 2021-11-21
  • 1970-01-01
相关资源
最近更新 更多