简体   繁体   English

JSON 字段是包含 JSON 的字符串; 如何将其转换为正确的 JSON?

[英]JSON field is string containing JSON; how do I convert that to proper JSON?

While converting a CSV file to JSON i am getting output like below:在将 CSV 文件转换为 JSON 时,我得到 output 如下所示:

 {
        "id": "8835435",
        "userid": "1111",
        "key": "diary_notifications",
        "setting": "{\n  \"standup_reminder\" : false,\n  \"weight_reminder_diary\" : true,\n  \"weight_reminder_notification\" : false,\n  \"meal_reminders_lunch\" : false,\n  \"meal_reminders_breakfast\" : false,\n  \"meal_reminders_snack\" : false,\n  \"weight_reminder_calendar\" : false,\n  \"weight_reminder_time\" : false,\n  \"meal_reminders_dinner\" : false,\n  \"water_reminders\" : false,\n  \"walking_reminder\" : false,\n  \"sleep_reminder\" : false\n}",
        "lastupdated": "2018-03-27 10:48:51",
        "creatd": "2014-11-13 15:47:23"
    }

How can I remove the newline characters from setting and convert the field to a proper list in Python code?如何从setting中删除换行符并将字段转换为 Python 代码中的正确列表? My code is:我的代码是:

import csv
import json

with open('data.csv', 'r') as f:
    reader = csv.reader(f)
    next(reader)
    data = []
    for row in reader:
        data.append({"id":row[0],"userid":row[1],"key":row[2],"setting":row[3],"lastupdated":row[4],"creatd":row[5]})
with open ("users.json","w") as f:
    json.dump(data,f,indent=4)

What needs to be added above?上面需要补充什么?

The setting field contains a Json string, so you should just parse it with the json module. setting字段包含 Json 字符串,因此您应该使用json模块对其进行解析。 Of course in only some lines contain a Json string and others only contain a plain one, you should protect the json.loads in a try block:当然,只有某些行包含 Json 字符串,而其他行仅包含普通字符串,您应该在try块中保护json.loads

import csv
import json
with open('data.csv', 'r') as f:
    reader = csv.reader(f)
    next(reader)
    data = []
    for row in reader:
        try:
            row[3] = json.loads(row[3])
        except json.JSONDecodeError:
            pass
        data.append({"id":row[0],"userid":row[1],"key":row[2],"setting":row[3],
         "lastupdated":row[4],"creatd":row[5]})
with open ("users.json","w") as f:
    json.dump(data,f,indent=4)

It should give (more or less):它应该给出(或多或少):

{
    "id": "8835435",
    "userid": "1111",
    "key": "diary_notifications",
    "setting": {
        "standup_reminder": false,
        "weight_reminder_diary": true,
        "weight_reminder_notification": false,
        "meal_reminders_lunch": false,
        "meal_reminders_breakfast": false,
        "meal_reminders_snack": false,
        "weight_reminder_calendar": false,
        "weight_reminder_time": false,
        "meal_reminders_dinner": false,
        "water_reminders": false,
        "walking_reminder": false,
        "sleep_reminder": false
    },
    "lastupdated": "2018-03-27 10:48:51",
    "creatd": "2014-11-13 15:47:23"
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM