如何将以下JSON格式重新格式化为特定值?

2024-05-14 00:55:40 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下JSON文件:

   a_lis= [
      {
        "id": "0394820934",
        "obj": [
          {
            "fruit": "mint",
            "origin": "brazil",
            "seller": "unknown",
            "record": false
          }
        ],
        "available": false,
        "count": 0
      },
      {
        "id": "0239840394",
        "obj": [
          {
            "fruit": "grapes",
            "origin": "origin",
            "seller": "unknown",
            "record": false
          },
          {
            "fruit": " ",
            "record": false
          },
          {
            "fruit": "ARN",
            "origin": "destination",
            "seller": "unknown",
            "record": true
          },
          {
            "fruit": " no ",
            "record": false
          },
          {
            "fruit": "apple",
            "origin": "unknown",
            "seller": "walmart",
            "record": false
          }
        ],
        "available": false,
        "count": 0
      },
      {
        "id": "0928293820982309",
        "obj": [
          {
            "fruit": "tomato",
            "origin": "COL",
            "seller": "unknown",
            "record": false
          },
          {
            "fruit": "Watermelon",
            "origin": "destination",
            "seller": "unknown",
            "record": false
          },
          {
            "fruit": " ",
            "record": false
          },
          {
            "fruit": "pear",
            "origin": "return_date",
            "seller": "walmart",
            "record": true
          }
        ],
        "available": false,
        "count": 0,
        "updated": 0
      },
      {
        "id": "23423423",
        "obj": [
          {
            "fruit": "10",
            "origin": "usa",
            "seller": "cotsco",
            "record": false
          }
        ],
        "available": false,
        "count": 0
      },
      {
        "id": "230948",
        "obj": [
          {
            "fruit": " ",
            "record": false
          },
          {
            "fruit": "pear",
            "origin": "adult_companion",
            "seller": "sears",
            "record": true
          },
          {
            "fruit": "apple",
            "record": false
          },
          {
            "fruit": "Watermelon",
            "origin": "Japan",
            "seller": "unknown",
            "record": true
          },
          {
            "fruit": " apple ",
            "record": false
          },
          {
            "fruit": " lemon ",
            "origin": "Canada",
            "seller": "unknown",
            "record": true
          },
          {
            "fruit": " the apple is good ",
            "record": false
          },
          {
            "fruit": " apple ",
            "origin": "COL",
            "seller": "sears",
            "record": true
          }
        ],
        "available": false,
        "count": 0
      }
    ]

上面的文件是一个目录列表。我如何复制并附加到a_list所有包含单词“apple”的子词典中,将该单词替换为单词lemon?。例如:

a_lis = [
  {
    "id": "0394820934",
    "obj": [
      {
        "fruit": "mint",
        "origin": "brazil",
        "seller": "unknown",
        "record": false
      }
    ],
    "available": false,
    "count": 0
  },
  {
    "id": "0239840394",
    "obj": [
      {
        "fruit": "grapes",
        "origin": "origin",
        "seller": "unknown",
        "record": false
      },
      {
        "fruit": " ",
        "record": false
      },
      {
        "fruit": "ARN",
        "origin": "destination",
        "seller": "unknown",
        "record": true
      },
      {
        "fruit": " no ",
        "record": false
      },
      {
        "fruit": "apple",
        "origin": "unknown",
        "seller": "walmart",
        "record": false
      }
    ],
    "available": false,
    "count": 0
  },
  {
    "id": "0928293820982309",
    "obj": [
      {
        "fruit": "tomato",
        "origin": "COL",
        "seller": "unknown",
        "record": false
      },
      {
        "fruit": "Watermelon",
        "origin": "destination",
        "seller": "unknown",
        "record": false
      },
      {
        "fruit": " ",
        "record": false
      },
      {
        "fruit": "pear",
        "origin": "return_date",
        "seller": "walmart",
        "record": true
      }
    ],
    "available": false,
    "count": 0,
    "updated": 0
  },
  {
    "id": "23423423",
    "obj": [
      {
        "fruit": "10",
        "origin": "usa",
        "seller": "cotsco",
        "record": false
      }
    ],
    "available": false,
    "count": 0
  },
  {
    "id": "230948",
    "obj": [
      {
        "fruit": " ",
        "record": false
      },
      {
        "fruit": "pear",
        "origin": "adult_companion",
        "seller": "sears",
        "record": true
      },
      {
        "fruit": "apple",
        "record": false
      },
      {
        "fruit": "Watermelon",
        "origin": "Japan",
        "seller": "unknown",
        "record": true
      },
      {
        "fruit": " apple ",
        "record": false
      },
      {
        "fruit": " lemon ",
        "origin": "Canada",
        "seller": "unknown",
        "record": true
      },
      {
        "fruit": " the apple is good ",
        "record": false
      },
      {
        "fruit": " apple ",
        "origin": "COL",
        "seller": "sears",
        "record": true
      }
    ],
    "available": false,
    "count": 0
  },
  {
    "id": "0239840394",
    "obj": [
      {
        "fruit": "grapes",
        "origin": "origin",
        "seller": "unknown",
        "record": false
      },
      {
        "fruit": " ",
        "record": false
      },
      {
        "fruit": "ARN",
        "origin": "destination",
        "seller": "unknown",
        "record": true
      },
      {
        "fruit": " no ",
        "record": false
      },
      {
        "fruit": "lemon",
        "origin": "unknown",
        "seller": "walmart",
        "record": false
      }
    ],
    "available": false,
    "count": 0
  },
  {
    "id": "230948",
    "obj": [
      {
        "fruit": " ",
        "record": false
      },
      {
        "fruit": "pear",
        "origin": "adult_companion",
        "seller": "sears",
        "record": true
      },
      {
        "fruit": "lemon",
        "record": false
      },
      {
        "fruit": "Watermelon",
        "origin": "Japan",
        "seller": "unknown",
        "record": true
      },
      {
        "fruit": " lemon ",
        "record": false
      },
      {
        "fruit": " lemon ",
        "origin": "Canada",
        "seller": "unknown",
        "record": true
      },
      {
        "fruit": " the lemon is good ",
        "record": false
      },
      {
        "fruit": " lemon ",
        "origin": "COL",
        "seller": "sears",
        "record": true
      }
    ],
    "available": false,
    "count": 0
  }
]

换言之,带有“apple”一词的原始词典保留在列表中,而带有“lemon”一词的复制版本则附加在原始列表中?我尝试如下解析json文件:

import json
from pprint import pprint
json_output = open('file.json','r')
json_output = json.loads(json_output.read())

但是,我不知道如何复制字典和查看字典的嵌套结构。你知道吗


Tags: idjsonfalsetrueobjapplecountorigin
1条回答
网友
1楼 · 发布于 2024-05-14 00:55:40

考虑到这里有许多列表和词典,遍历它们似乎非常费劲。你知道吗

解决这个问题的一个更简单的方法就是将它转换成一个字符串,用“lemon”替换“apple”,然后将它转换成一个新的JSON文件,然后将两个JSON文件合并成第三个,这两个文件合并在一起。你知道吗

此代码适用于稍微修改的JSON文件:

import json

with open('a_lis-wquotes.json') as fa:
    a = json.load(fa)
    stra = (str(a))
    strb = stra.replace("apple", "lemon")
    strb = strb.replace("'", '"')
    with open('b_lis.json', 'w') as fb:
        fb.write(strb)

with open('a_lis-wquotes.json') as fa:
    a = json.load(fa)
    with open('b_lis.json') as fb:
        b = json.load(fb)
    c = a + b
    strc = str(c)
    strc = strc.replace("'", '"')
    with open('c_lis.json', 'w') as fc:
        fc.write(strc)

你会注意到这里有很多关于引号的游戏。你知道吗

这有几个原因: -Python的jsondecoder不想导入原始的JSON,因为它在标记为“true”和“false”的记录周围缺少双引号-wquotes.json文件"). 我在一个文本编辑器中用find/replace做了这个。如果您不能在文本编辑器中这样做,因为文件太大,或者您有太多的文件要手动执行此操作,那么您可以在Python中通过将文件作为文本文件加载并在那里执行文本替换来执行相同的操作。你知道吗

  • 将JSON加载到python中并在字符串中对其进行操作时,JSON双引号被单引号替换。这就是为什么我必须在将strb作为JSON操作之前将其写入文件。

  • 在合并文件a和文件b并将JSON写入文件时,单引号/双引号问题再次出现。

总的来说,我相信输出与您所期望的输出相匹配(不过,请再次忽略单引号/双引号的差异):

[   {   'available': 'false',
        'count': 0,
        'id': '0394820934',
        'obj': [   {   'fruit': 'mint',
                       'origin': 'brazil',
                       'record': 'false',
                       'seller': 'unknown'}]},
    {   'available': 'false',
        'count': 0,
        'id': '0239840394',
        'obj': [   {   'fruit': 'grapes',
                       'origin': 'origin',
                       'record': 'false',
                       'seller': 'unknown'},
                   {'fruit': ' ', 'record': 'false'},
                   {   'fruit': 'ARN',
                       'origin': 'destination',
                       'record': 'true',
                       'seller': 'unknown'},
                   {'fruit': ' no ', 'record': 'false'},
                   {   'fruit': 'apple',
                       'origin': 'unknown',
                       'record': 'false',
                       'seller': 'walmart'}]},
    {   'available': 'false',
        'count': 0,
        'id': '0928293820982309',
        'obj': [   {   'fruit': 'tomato',
                       'origin': 'COL',
                       'record': 'false',
                       'seller': 'unknown'},
                   {   'fruit': 'Watermelon',
                       'origin': 'destination',
                       'record': 'false',
                       'seller': 'unknown'},
                   {'fruit': ' ', 'record': 'false'},
                   {   'fruit': 'pear',
                       'origin': 'return_date',
                       'record': 'true',
                       'seller': 'walmart'}],
        'updated': 0},
    {   'available': 'false',
        'count': 0,
        'id': '23423423',
        'obj': [   {   'fruit': '10',
                       'origin': 'usa',
                       'record': 'false',
                       'seller': 'cotsco'}]},
    {   'available': 'false',
        'count': 0,
        'id': '230948',
        'obj': [   {'fruit': ' ', 'record': 'false'},
                   {   'fruit': 'pear',
                       'origin': 'adult_companion',
                       'record': 'true',
                       'seller': 'sears'},
                   {'fruit': 'apple', 'record': 'false'},
                   {   'fruit': 'Watermelon',
                       'origin': 'Japan',
                       'record': 'true',
                       'seller': 'unknown'},
                   {'fruit': ' apple ', 'record': 'false'},
                   {   'fruit': ' lemon ',
                       'origin': 'Canada',
                       'record': 'true',
                       'seller': 'unknown'},
                   {'fruit': ' the apple is good ', 'record': 'false'},
                   {   'fruit': ' apple ',
                       'origin': 'COL',
                       'record': 'true',
                       'seller': 'sears'}]},
    {   'available': 'false',
        'count': 0,
        'id': '0394820934',
        'obj': [   {   'fruit': 'mint',
                       'origin': 'brazil',
                       'record': 'false',
                       'seller': 'unknown'}]},
    {   'available': 'false',
        'count': 0,
        'id': '0239840394',
        'obj': [   {   'fruit': 'grapes',
                       'origin': 'origin',
                       'record': 'false',
                       'seller': 'unknown'},
                   {'fruit': ' ', 'record': 'false'},
                   {   'fruit': 'ARN',
                       'origin': 'destination',
                       'record': 'true',
                       'seller': 'unknown'},
                   {'fruit': ' no ', 'record': 'false'},
                   {   'fruit': 'lemon',
                       'origin': 'unknown',
                       'record': 'false',
                       'seller': 'walmart'}]},
    {   'available': 'false',
        'count': 0,
        'id': '0928293820982309',
        'obj': [   {   'fruit': 'tomato',
                       'origin': 'COL',
                       'record': 'false',
                       'seller': 'unknown'},
                   {   'fruit': 'Watermelon',
                       'origin': 'destination',
                       'record': 'false',
                       'seller': 'unknown'},
                   {'fruit': ' ', 'record': 'false'},
                   {   'fruit': 'pear',
                       'origin': 'return_date',
                       'record': 'true',
                       'seller': 'walmart'}],
        'updated': 0},
    {   'available': 'false',
        'count': 0,
        'id': '23423423',
        'obj': [   {   'fruit': '10',
                       'origin': 'usa',
                       'record': 'false',
                       'seller': 'cotsco'}]},
    {   'available': 'false',
        'count': 0,
        'id': '230948',
        'obj': [   {'fruit': ' ', 'record': 'false'},
                   {   'fruit': 'pear',
                       'origin': 'adult_companion',
                       'record': 'true',
                       'seller': 'sears'},
                   {'fruit': 'lemon', 'record': 'false'},
                   {   'fruit': 'Watermelon',
                       'origin': 'Japan',
                       'record': 'true',
                       'seller': 'unknown'},
                   {'fruit': ' lemon ', 'record': 'false'},
                   {   'fruit': ' lemon ',
                       'origin': 'Canada',
                       'record': 'true',
                       'seller': 'unknown'},
                   {'fruit': ' the lemon is good ', 'record': 'false'},
                   {   'fruit': ' lemon ',
                       'origin': 'COL',
                       'record': 'true',
                       'seller': 'sears'}]}]

相关问题 更多 >