我已成功将简单的JSON转换为CSV。
当文件包含JSON对象数组时,我遇到了问题。
我正在使用csv
模块而不是pandas
进行转换。
请参考下面的内容,这些内容正在成功处理,而失败:
成功(当文件包含json对象的单个列表/数组时):
[{"value":0.97,"key_1":"value1","key_2":"value2","key_3":"value3","key_11":"2019-01-01T00:05:00Z"}]
失败:
[{"value":0.97,"key_1":"value1","key_2":"value2","key_3":"value3","key_11":"2019-01-01T00:05:00Z"}]
[{"value":0.97,"key_1":"value1","key_2":"value2","key_3":"value3","key_11":"2019-01-01T00:05:00Z"}]
[{"value":0.97,"key_1":"value1","key_2":"value2","key_3":"value3","key_11":"2019-01-01T00:05:00Z"}]
json.loads
函数引发异常,如下所示:
Extra data ; line 1 column 6789 (char 1234)
如何处理此类文件?
编辑: 使用Kinesis Firehorse刷新此文件并将其推送到S3。 我正在使用lambda下载文件并加载并进行转换。 因此它不是 .json 文件。
答案 0 :(得分:4)
按如下方式解析每一行:
with open('input.json') as f:
for line in f:
obj = json.loads(line)
答案 1 :(得分:1)
因为您的文件不是有效的JSON。您必须逐行阅读文件,然后将每一行分别转换为对象。
或者,您可以像这样转换文件结构...
[
{
"value": 0.97,
"key_1": "value1",
"key_2": "value2",
"key_3": "value3",
"key_11": "2019-01-01T00:05:00Z"
},
{
"value": 0.97,
"key_1": "value1",
"key_2": "value2",
"key_3": "value3",
"key_11": "2019-01-01T00:05:00Z"
},
{
"value": 0.97,
"key_1": "value1",
"key_2": "value2",
"key_3": "value3",
"key_11": "2019-01-01T00:05:00Z"
}
]
,它将是有效的JSON文件。
答案 2 :(得分:0)
正如tanaydin所说,您输入的失败是无效的json。它应该看起来像这样:
[
{
"value":0.97,
"key_1":"value1",
"key_2":"value2",
"key_3":"value3",
"key_11":"2019-01-01T00:05:00Z"
},
{"value":0.97,"key_1":"value1","key_2":"value2","key_3":"value3","key_11":"2019-01-01T00:05:00Z"},
{"value":0.97,"key_1":"value1","key_2":"value2","key_3":"value3","key_11":"2019-01-01T00:05:00Z"}
]
我假设您通过遍历对象列表并在每个对象上调用json.dumps
来创建json输出。您应该创建词典列表,然后在整个列表上调用json.dumps
。
list_of_dicts_to_jsonify = {}
object_attributes = ['value', 'key_1', 'key_2', 'key_3', 'key_11']
for item in list_of_objects:
# Convert object to dictionary
obj_dict = {}
for k in object_attributes:
obj_dict[k] = getattr(item, k) or None
list_of_dicts_to_jsonify.append(obj_dict)
json_output = json.dumps(list_of_dicts_to_jsonify)