Python 如何将以下JSON重新格式化为特定值?
我有以下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
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。