从CSV读取并将对象转换为JSON

时间:2019-06-12 13:46:28

标签: c# asp.net json

我正在从CSV文件中读取行并将其加载到对象列表中。我需要将每个对象都转换为JSON,但是到目前为止,我尝试的所有操作(如JsonConvert.SerializeObject都无法正常工作。

该行与以下内容完全相同(从CSV复制):

{ email = premium22@utoo.email, name = Premium Dois CEDRO, ip = 0.0.0.1,
action = login, timeStamp = 2019-06-12 13:30:11Z }

当我读取并加载时,对象看起来像这样:

"{ email = premium22@utoo.email, name = Premium Dois CEDRO, ip = 0.0.0.1,
action = login, timeStamp = 11/06/2019 17:44:03 }"

在列表中加载逗号时,会将逗号放在对象中,并将双引号放在每个对象周围。 最后,当我使用SerializeObject时,它返回以下内容:

"[\"{ email = premium22@utoo.email, name = Premium Dois CEDRO, ip =
0.0.0.1, action = login, timeStamp = 2019-06-12 13:30:11Z }\"

我需要的输出是一个像这样的Json:

{
  "email": "premium22@utoo.email",
  "name": "Premium Dois CEDRO",
  "ip": "0.0.0.1",
  "action": "login",
  "timeStamp": "2019-06-11T18:50:02.0091122Z"
}

要从文件和加载列表中读取的代码:

using (var reader = new StreamReader($"{filePath}CONTINGENCY AUDIT LOG.csv"))
                {
                List<object> contingencyList = new List<object>();

                while (!reader.EndOfStream)
                {
                    var line = reader.ReadLine();
                    contingencyList.Add(line);
                }
                string jsonList = JsonConvert.SerializeObject(contingencyList);
                    reader.Close();
                return contingencyList;
                }

要遍历列表的代码:

foreach (object item in contingencyList)
            { Console.WriteLine(item);
                }

2 个答案:

答案 0 :(得分:0)

即使源格式看起来不像.csv文件,您也需要遵循以下步骤来实现这种任务:

  1. 逐行读取.csv文件
  2. 解析每一行并填充代表对象的类的属性。您可以将一个字符串(您刚刚阅读的.csv行)传递给类构造函数,然后在此处进行解析,以填充所有属性。
public class MyClass
{
    public string Email { get; set; }
    public string Name {get; set; }
    // ... and so on with other properties

    public MyClass(string csvLine)
    {
        // Here parse the line and fill the properties
    }
}
  1. 在此类中重写ToString()函数,并在此执行JSON序列化(例如,使用函数System.Web.Script.Serialization.JavaScriptSerializer().Serialize(string)
public class MyClass
{      
    // ...

    public override string ToString()
    {
        return new JavaScriptSerializer().Serialize(this);
    }
}

您的代码将类似于:

while (!reader.EndOfStream)
{
    var line = reader.ReadLine();
    MyClass mc = new MyClass(line);
    string jsonString = mc.ToString();
}

答案 1 :(得分:0)

如果可能,请通过删除诸如email =之类的列说明来正确获取CSV文件的格式,并确保设置诸如;之类的适当列分隔符。 最后,您的文件应如下所示:

email@example.com;ExampleName;127.0.0.1;login;2019-06-12 13:30:11Z
email2@example.com;ExampleName2;0.0.0.1;logout;2019-06-12 13:30:11Z

然后定义一个新类:

public class CSVEntry
{
    public string Email { get; set }
    public string Name { get; set; }
    public IPAddress IPAddress { get; set; }
    public string Action { get; set; } 
    public DateTime Timestamp { get; set; }       

    public CSVEntry(string email, string name, IPAddress ip, string action, DateTime timestamp)
    {
        Email = email;
        Name = name;
        IPAddress = ip;
        Action = action;
        Timestamp = timestamp;
    }

    public static CSVEntry Parse(string csvLine)
    {
        string[] args = csvLine.Split(';');

        if (args.Length >= 5)
        {
            string email = args[0];
            string name = args[1];
            IPAddress ip = IPAddress.Parse(args[2]);
            string action = args[3];
            DateTime timestamp = DateTime.Parse(args[4]);

            return new CSVEntry(email, name, ip, action, timestamp);
        }

        return null;
    }
}

如果无法更改格式,则需要使用regex之类的其他方法来解析csv行。

接下来,逐行浏览CSV文件,使用CSVEntry.Parse(line);创建对象并将其添加到List<CSVEntry>中,例如:

var list = new List<CSVEntry>();

while (!reader.EndOfStream)
{
    string line = reader.ReadLine();
    list.Add(CSVEntry.Parse(line));
}

然后,您可以使用JsonConvert.SerializeObject(list);

对其进行序列化