Python 无法将json文件字典中的重复字符串解析为密钥/值对

Python 无法将json文件字典中的重复字符串解析为密钥/值对,python,json,dictionary,duplicates,Python,Json,Dictionary,Duplicates,我无法解析与“details”键关联的一些字符串。 details key的值具有重复的字符串,该字符串应提取为一对key/value 这是json数据的示例 { "response": { "client_log": { "data": [ { "login": "AAAAAAAAAAAAAA", "state": "MC", "details": "Please find report belo

我无法解析与“details”键关联的一些字符串。 details key的值具有重复的字符串,该字符串应提取为一对key/value

这是json数据的示例

{
  "response": {
   "client_log": {
      "data": [
        {
          "login": "AAAAAAAAAAAAAA",
          "state": "MC",
          "details": "Please find report below:\r\n\r\n------Report Information------\r\n\r\nEmail Id: user1@gmail.com\r\nServ Id: 112233\r\nProd Num: 11111\r\nProd Unit: Super-A\r\nProd Type: type-A\r\n,Serv Id: 445566\r\nProd Num: 22222\r\nProd Unit: Super-C\r\nProd Type: type-A\r\n,Serv Id: 003377\r\nProd Num: 123456\r\nProd Unit: Super-B\r\nProd Type: type-X\r\nState: LONDON\r\nCity: LONDON\r\n\r\n------Service Information------\r\n\r\nUser Name: John Clark\r\nMobile Number: 000111222\r\n\r\n------Reported Form------\r\n\r\nForm-1: zzzzz\r\nType: 111\r\n\r\nRemarks: Remarks 123.",
          "log_number": "1"
        },
        {
          "login": "BBBBBBBBBBBBB",
          "state": "XX",
          "details": "Please find report below:\r\n\r\n------Report Information------\r\n\r\nEmail Id: user2@gmail.com\r\nServ Id: 767878\r\nProd Num: 34689\r\nProd Unit: Super-B\r\nProd Type: type-B\r\n,Serv Id: 128900\r\nProd Num: 13689\r\nProd Unit: Super-A\r\nProd Type: type-B\r\n,Serv Id: 96333\r\nProd Num: 0011321\r\nProd Unit: Super-C\r\nProd Type: type-C\r\nState: State2\r\nCity: City2\r\n\r\n------Service Information------\r\n\r\nUser Name: Marry\r\nMobile Number: 982130989\r\n\r\n------Reported Form------\r\n\r\nForm-1: xxxxxx\r\nType: 222\r\n\r\nRemarks: Remarks 456.",
          "log_number": "1"
        }
      ],
      "query": "13"
    },
    "response_time": "0.723494",
    "transaction_id": "909122",
    "transaction_status": "OK"

  }
}
从上面的示例中,请参考下面的详细信息

"details": "Please find report below:\r\n\r\n------Report Information------\r\n\r\nEmail Id: user1@gmail.com\r\nServ Id: 112233\r\nProd Num: 11111\r\nProd Unit: Super-A\r\nProd Type: type-A\r\n,Serv Id: 445566\r\nProd Num: 22222\r\nProd Unit: Super-C\r\nProd Type: type-A\r\n,Serv Id: 003377\r\nProd Num: 123456\r\nProd Unit: Super-B\r\nProd Type: type-X\r\nState: LONDON\r\nCity: LONDON\r\n\r\n------Service Information------\r\n\r\nUser Name: John Clark\r\nMobile Number: 000111222\r\n\r\n------Reported Form------\r\n\r\nForm-1: zzzzz\r\nType: 111\r\n\r\nRemarks: Remarks 123.",

获得了重复的键,例如上面示例中的键“Prod Num”、“Prod Unit”和“Prod Type”,这些键出现了两次

当我读取该文件时,它没有返回“details”下所需的所有密钥…示例输出如下

{
          'city': 'LONDON',
          'login': 'AAAAAAAAAAAAAA',
          'state': 'MC',
          'details': 'Please find report below:\r\n\r\n------Report Information------\r\n\r\nEmail Id: user1@gmail.com\r\n**Serv Id: 112233\r\nProd Num: 11111\r\nProd Unit: Super-A\r\nProd Type: type-A\r\n,Serv Id: 445566\r\nProd Num: 22222\r\nProd Unit: Super-C\r\nProd Type: type-A\r\n,Serv Id: 003377\r\nProd Num: 123456\r\nProd Unit: Super-B\r\nProd Type: type-X**\r\nState: LONDON\r\nCity: LONDON\r\n\r\n------Service Information------\r\n\r\nUser Name: John Clark\r\nMobile Number: 000111222\r\n\r\n------Reported Form------\r\n\r\nForm-1: zzzzz\r\nType: 111\r\n\r\nRemarks: Remarks 123.',
          'log_number': '1',
          'department': 'Sales',
          'staff_id': 'S123',
          'staff_name': 'EricY',
          'timestamp': '2020-02-27 15:57:24',
          'Email_Id': 'user1@gmail.com',
          'Serv_Id': '112233',
          'Prod_Num': '123456',
          'Prod_Unit': 'Super-B',
          'Prod_Type': 'type-X',
          ',Serv_Id': '003377',
          'State': 'LONDON',
          'City': 'LONDON',
          'User_Name': 'John Clark',
          'Mobile_Number': '000111222',
          'Form-1': 'zzzzz',
          'Type': '111',
          'Remarks': 'Remarks 123.'
        },
如果你能从上面看到我得到的输出

'Serv_Id': '112233' , 'Prod_Num': '123456', 'Prod_Unit': 'Super-B', 'Prod_Type': 'type-X' and ',Serv_Id': '003377' 
由于相同的键,它将用最后/最新的值替换每个键的值。。。在这种情况下,根据以下值……替换先前的值

Prod Num: 123456, Prod Unit: Super-B and Prod Type: type-X after key ',Serv_Id': '003377'
我想这是由于钥匙的重复。有些词典也有不止一个“Serv_Id”键。。。这意味着字典列表中会有更多重复的Prod Num、Prod Unit和Prod Type,不能作为密钥对正确读取。相同的键将替换为最新的值

如何克服这个重复的关键?可能需要将密钥名称更改为不同的名称以使其唯一

我希望输出如下

{
          'city': 'LONDON',
          'login': 'AAAAAAAAAAAAAA',
          'state': 'MC',
          'details': 'Please find report below:\r\n\r\n------Report Information------\r\n\r\nEmail Id: user1@gmail.com\r\nServ Id: 112233\r\nProd Num: 11111\r\nProd Unit: Super-A\r\nProd Type: type-A\r\n,Serv Id: 445566\r\nProd Num: 22222\r\nProd Unit: Super-C\r\nProd Type: type-A\r\n,Serv Id: 003377\r\nProd Num: 123456\r\nProd Unit: Super-B\r\nProd Type: type-X\r\nState: LONDON\r\nCity: LONDON\r\n\r\n------Service Information------\r\n\r\nUser Name: John Clark\r\nMobile Number: 000111222\r\n\r\n------Reported Form------\r\n\r\nForm-1: zzzzz\r\nType: 111\r\n\r\nRemarks: Remarks 123.',
          'log_number': '1',
          'department': 'Sales',
          'staff_id': 'S123',
          'staff_name': 'EricY',
          'timestamp': '2020-02-27 15:57:24',
          'Email_Id': 'user1@gmail.com',
          'Serv_Id': '112233', ------>1st Serv_Id 
          'Prod_Num_1': '111111',--->1st prod_num with new keyname
          'Prod_Unit_1': 'Super-A', --->1st prod_unit with new keyname
          'Prod_Type_1': 'type-A', --->1st prod_type with new keyname
          ',Serv_Id': '003377',------>2nd Serv_Id with new keyname
          'Prod_Num_2': '123456',--->2nd prod_num with new keyname
          'Prod_Unit_2': 'Super-B', --->2nd prod_unit with new keyname
          'Prod_Type_2: 'type-X', ---> 2nd prod_type with new keyname
          'State': 'LONDON',
          'City': 'LONDON',
          'User_Name': 'John Clark',
          'Mobile_Number': '000111222',
          'Form-1': 'zzzzz',
          'Type': '111',
          'Remarks': 'Remarks 123.'
        },

***The ',Serv_Id' key can be more than one. ***

下面是我用来读取文件并将“细节”提取到密钥对的脚本

for entry in mydata['response']['client_log']['data']:
    parsed_details = {}
    for line in entry['details'].split('\r\n'):
        try:
            key, value = line.split(': ', maxsplit=1)
            parsed_details[key] = value
            parsed_details = { x.translate({32:'_'}) : y  
                for x, y in parsed_details.items()}
        except ValueError:
            pass

    entry.update(parsed_details)


我感谢你在这件事上的帮助。请引导我。谢谢你编辑:我昨晚写得很晚,回来做了一些编辑

在本例中,您可以使用一些简单的字符串操作来完成希望完成的操作。我对您的原始代码进行了一些编辑,并强调了代码注释中的差异

import json

myfile = 'sample.json'

with open(myfile, 'r') as f:
   mydata = json.load(f)

for entry in mydata['response']['client_log']['data']:
    my_keys = []
    my_values = []
    for i, line in enumerate(entry['details'].split('\r\n')):
        # If we find ": " in the line, then it contains a key, value pair
        if ": " in line:
            # Strip the line of whitespace and "," and then split it on ":"
            line = line.strip().strip(",").split(":")
            # Add the key to the keys array, and add the value to the values
            my_keys.append(line[0].replace(" ", "_"))
            my_values.append(line[1].strip())
    # Set an increment variable
    inc = 1
    parsed_details = {}
    key_str = ""
    # For each key and value in the keys and values
    for key, value in zip(my_keys, my_values):
        # If their are duplicate keys of the given key
        if my_keys.count(key) > 1:
            # Create a key_str to add onto the key
            key_str = "_{}".format(inc)
            key = key + key_str
            # If this key exists, increment the counter by 1
            if key in list(parsed_details.keys()):
                inc += 1
                # Strip the old key_str and add the new one
                key = key.strip(key_str)+ "_{}".format(inc)
        parsed_details[key] = value
    entry.update(parsed_details)
print(mydata)

字典不支持重复键。然而,如果您需要使用字典,这里有一个问题,它提供了一些解决方法。你好,先生。。。它以{}{}的形式返回输出字典,其中应以{},{}的形式返回多个字典,每个字典之间有一个逗号。@Tristen感谢您对堆栈溢出的贡献。如果你用文字解释它是如何解决老年退休金问题的,你的答案会更有帮助。@chenoi我做了一个小编辑。我把条目单独打印出来,这样你就可以看到你所展示的内容了。我删除了print(条目),而在末尾put print(mydata)这段代码应该满足您的要求,如果没有,您是否可以更清楚地说明输出应该是什么?您好,先生……谢谢您的澄清,我已经相应地做了更改……我刚刚注意到了。我需要用很少的其他数据来测试它。我会回来的。谢谢你,先生。我需要用实际数据来测试它。。。。我会相应地更新。你的代码很有魅力…谢谢