将字符串存储到JSON对象中 - Python

3

我已经阅读了很多关于这个问题的问题,但没有找到任何有关str的。

我得到了一个长字符串,其中包含16个字节的名称,后面跟着4个字节的数字,并重复N个人。例如如下:

*编辑:1)字符串是msg

2)将迈克添加到预期输出中

msg = 'George\0\0\0\0\0\0\0\0\0\0' + '0095' + 'Mikeeeeeeeeeeee\0' + '0100' + 'Kelly\0\0\0\0\0\0\0\0\0\0\0' + '0000'

现在我需要将这些数据存储到json对象中。我尝试了循环,但它总是在重新编写之前覆盖存储的数据。我想要的是以下内容(但适用于更长的字符串),因为为每个数据编写msg [start:end]完全是愚蠢的。

data = {}
data[msg[0:16]] = {
    "marks" : msg[16:20]
}
data[msg[20:36]] = {
    "marks" : msg[36:40]
}
data[msg[40:56]] = {
    "marks" : msg[56:60]
}

预期输出:

{
"George\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000": {
    "marks": "0095"
    }, 
"Kelly\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000": {
    "marks": "0000"
    },
 "Mikeeeeeeeeeeee\u0000": {
    "marks": "0100"
    }
}

谢谢


这是因为您正在将字符串的每个部分都制作成对象,而不是将其制作为预期的嵌套对象。 - warl0ck
你已经发布了由一些文本块组成的“string”变量,然后正在使用“msg”变量。显示“msg”的值。 - RomanPerekhrest
你在消息字符串中提到的 Mikee 是什么意思? - warl0ck
我已经编辑了问题。对于造成的困惑,我感到抱歉。 - fieq.fikri
2个回答

2
假设您想在data中获取所有对象的详细信息,即George、Mike和Kelly,并且您的消息长度仅为60,而您正在访问76及其之后的内容。因此,要开始附加对象,您应该根据所需的输出结果创建一个嵌套的JSON,例如:
length = len(msg)
i = 0
data = {}
while i < length:
    data[msg[i:i+16]] = {"marks" : msg[i+16:i+20]}
    i += 20
print data

输出:

{'George\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00': {'marks': '0095'}, 'Mikeeeeeeeeeeee\x00': {'marks': '0100'}, 'Kelly\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00': {'marks': '0000'}}

希望这可以帮助到您。

“msg” 是由服务器发送的,因此我永远不会知道实际数据的长度。 我希望能够摆脱 msg[start:end] 中的数字。 - fieq.fikri
好的,所以您想要动态创建数据对象?这是您想要的输出方式吗?由于您的完整解析基于此,msg字符串长度是否始终为20的倍数? - warl0ck
是的,有些东西可以简化对象的创建,而不使用“魔数”。 - fieq.fikri
很高兴能帮到你 :) - warl0ck

1
import re
dict(re.findall(r'(\D+)(\d{4})', string))

它将返回类似以下的响应:

...

{'George\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00': '0095', 'Kelly\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00': '0000', 'Mikeeeeeeeeeeee\x00': '0100'} 

现在你已经得到了这个字典,可以按照你想要的任何格式进行更改。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接