如何在不影响格式的情况下附加json文件

时间:2013-12-17 05:47:19

标签: c# json file-io

我正在处理一个文件来添加/检索数据。数据格式为 JSON 。我是新手。 我正在使用 JSON.NET 来序列化和反序列化数据。 这是json格式

{
  "EmpId": 1,
  "Name": "Kaushik",
  "Designation": ".net Developer",
  "JoiningDate": "09/23/2013",
  "Skill": [
    {
      "Id": 1,
      "SkillName": "C#"
    },
    {
      "Id": 2,
      "SkillName": "PHP"
    },
    {
      "Id": 3,
      "SkillName": "java"
    }
  ]
}

这是我正在研究的JSON格式。 问题描述

  1. 我想附加文件数据,所以我可以添加更多的json,为此我需要检查是否已有一些数据?
  2. 和第二个我想在json文件中附加数据,附加的数据形式将如下所示
  3. [
        {
            "EmpId": 1,
            "Name": "Kaushik",
            "Designation": ".net Developer",
            "JoiningDate": "09/23/2013",
            "Skill": [
                {
                    "Id": 1,
                    "SkillName": "C#"
                },
                {
                    "Id": 2,
                    "SkillName": "PHP"
                },
                {
                    "Id": 3,
                    "SkillName": "java"
                }
            ]
        },
        {
            "EmpId": 1,
            "Name": "Kaushik",
            "Designation": ".net Developer",
            "JoiningDate": "09/23/2013",
            "Skill": [
                {
                    "Id": 1,
                    "SkillName": "C#"
                },
                {
                    "Id": 2,
                    "SkillName": "PHP"
                },
                {
                    "Id": 3,
                    "SkillName": "java"
                }
            ]
        } ]

    所以主要的问题是我没有得到附加文件的确切逻辑。

    我正在通过char读取文件char,如下所示

    
        int count = 0;
                    EmployeeDetail employee = new EmployeeDetail
                    {
    
                        EmpId = ++count,
                        Name = formCollection["Name"],
                        Designation = formCollection["Designation"],
                        JoiningDate = formCollection["JoiningDate"],
                        Skill = new List 
                        {
                            new Skills(){Id = 1, SkillName = "C#"},
                            new Skills(){Id = 2, SkillName = "PHP"},
                            new Skills(){Id = 3, SkillName = "java"}
                        }
    
                    };
    
                    string json = JsonConvert.SerializeObject(employee,Formatting.Indented);
                    var dataFile = Server.MapPath("~/App_Data/json_data.json");
                    //Reading the file 
                    StreamReader reader = new StreamReader(dataFile);
                    int Tchar = 0;
                    char ch;
                    do
                    {
                        ch = (char)reader.Read();
    
                        Response.Write(ch);
                        Tchar++;
                    } while (!reader.EndOfStream);
                    reader.Close();
    
                    StreamWriter file = new StreamWriter(dataFile,append:true);
    
                    file.WriteLine(json);
    
                    file.Close();
    
    

    所以感谢任何帮助谢谢

2 个答案:

答案 0 :(得分:16)

您最好和最可靠的方法是不附加到文件,而是读取整个JSON文件并反序列化为对象,附加到对象集合,然后将输出序列化回JSON文件。

我为你创建了这个样本(相应地更改了路径和类):

var filePath = @"C:\Users\grahamo\Documents\Visual Studio 2013\Projects\WebApplication1\WebApplication1\bin\path.json";
// Read existing json data
var jsonData = System.IO.File.ReadAllText(filePath);
// De-serialize to object or create new list
var employeeList = JsonConvert.DeserializeObject<List<EmployeeDetail>>(jsonData) 
                      ?? new List<EmployeeDetail>();

// Add any new employees
employeeList.Add(new EmployeeDetail()
{
    Name = "Test Person 1"
});
employeeList.Add(new EmployeeDetail()
{
    Name = "Test Person 2"
});

// Update json data string
jsonData = JsonConvert.SerializeObject(employeeList);
System.IO.File.WriteAllText(filePath, jsonData);

如果我是新人,请立即投票或打勾作为答案,如果我帮助过你的话。

答案 1 :(得分:1)

CopyTo上有一个FileStream方法。 因此,您不需要读取char-by-char,打开文件流并CopyTo到响应流。

另外我建议你首先重新编译文件(使用Json.NET,你可以简单地使用dynamic来避免搞乱具体类型),并且因为它是一个对象数组,然后添加你的新对象到这个数组并保存回来。

由于您重新保存整个文件,格式将始终正确。

P.S。你可能无法只追加,因为文件中的序列化JSON对象是“已关闭”(你有} ]),所以附加文本将无效。