Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何将以下JSON重新格式化为特定值?_Python_Json_Python 3.x - Fatal编程技术网

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

Python 如何将以下JSON重新格式化为特定值?,python,json,python-3.x,Python,Json,Python 3.x,我有以下JSON文件: a_lis= [ { "id": "0394820934", "obj": [ { "fruit": "mint", "origin": "brazil", "seller": "unknown", "record": false } ], "availab

我有以下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
      }
    ]
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)
上面的文件是一个目录列表。我如何复制并附加到
a_列表
包含“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
  }
]
换句话说,带有“苹果”一词的原始词典保留在列表中,而复制版本则附加在原始列表中,但带有“柠檬”一词?我尝试按如下方式解析json文件:

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

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

鉴于这里有许多列表和字典,遍历它们似乎非常困难

解决这个问题的一个更简单的方法是将其转换为字符串,将“apple”替换为“lemon”,然后将其转换为一个新的JSON文件,并将两个JSON文件合并为第三个,将两者合并

此代码适用于稍加修改的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
      }
    ]
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”的记录周围缺少双引号。我在开始之前将这些引号添加到JSON文件中(因此文件名为“a_lis-wquotes.JSON”)。我在文本编辑器中使用find/replace实现了这一点。如果您无法在文本编辑器中执行此操作,因为文件太大,或者您有太多的文件无法手动执行此操作,那么您可以在Python中执行相同的操作,方法是将文件作为文本文件加载,然后在那里执行文本替换

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

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

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


考虑到这里有很多列表和词典,遍历它们似乎非常费劲

解决这个问题的一个更简单的方法是将其转换为字符串,将“apple”替换为“lemon”,然后将其转换为一个新的JSON文件,并将两个JSON文件合并为第三个,将两者合并

此代码适用于稍加修改的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
      }
    ]
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”的记录周围缺少双引号。我在开始之前将这些引号添加到JSON文件中(因此文件名为“a_lis-wquotes.JSON”)。我在文本编辑器中使用find/replace实现了这一点。如果您无法在文本编辑器中执行此操作,因为文件太大,或者您有太多的文件无法手动执行此操作,那么您可以在Python中执行相同的操作,方法是将文件作为文本文件加载,然后在那里执行文本替换

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

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

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


谢谢你的帮助,但是我得到了一个
JSONDecodeError:Expecting value:line 1 column 146(char 145)
在'14 with open('../Downloads/b_lis.json')中作为fb:-->15b=json.load(fb)`可能找不到单词?json正是你上面所说的吗?是的,第一部分工作正常,但是代码的第二部分不起作用。。。知道该怎么做吗?错误表明正在写入的文件(b_lis.json)没有正确地作为json写入,然后json解码器在打开它时出现问题。代码在我这边起作用。您开始使用的JSON和上面的JSON,或者您正在使用的代码和上面的代码之间有什么不同吗?请注意,我通过在整个文件中为标记为true和false的值添加双引号来更改您的JSON。感谢您的帮助,但是我得到了一个
JSONDecodeError:期望值:第1行第146列(char 145)
在'14 with open('../Downloads/b_lis.json')中作为fb:-->15 b=json.load(fb)`可能找不到单词?json与上面的内容完全一样吗?是的,第一部分工作正常,但是代码的第二部分不工作……知道该做什么吗?错误表明文件正在编写中(b_lis.json)没有正确地编写为JSON,然后JSON解码器在打开它时出现问题。代码在我这方面起作用。您开始使用的JSON和上面的JSON之间,或者您正在使用的代码和上面的代码之间,有什么甚至有点不同吗?请注意,我通过在标记为true和true的值上添加双引号来更改您的JSON在整个文件中为false。