首页 > 解决方案 > JSON 字段是包含 JSON 的字符串;如何将其转换为正确的 JSON?

问题描述

在将 CSV 文件转换为 JSON 时,我得到如下输出:

 {
        "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"
    }

如何从settingPython 代码中删除换行符并将字段转换为正确的列表?我的代码是:

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)

上面需要补充什么?

标签: pythonjson

解决方案


setting字段包含一个 Json 字符串,因此您应该使用json模块对其进行解析。当然,只有一些行包含一个 Json 字符串,而其他行只包含一个普通的,你应该在一个块中保护:json.loadstry

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)

它应该给出(或多或少):

{
    "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"
}

推荐阅读