【问题标题】:How to Append a json file without disturbing the formatting如何在不干扰格式的情况下附加 json 文件
【发布时间】:2013-12-17 05:47:18
【问题描述】:

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

{ “EmpId”:1, “名称”:“考希克”, “名称”:“.net 开发人员”, "加入日期": "09/23/2013", “技能”: [ { “身份证”:1, “技能名称”:“C#” }, { “身份证”:2, “技能名称”:“PHP” }, { “身份证”:3, “技能名称”:“java” } ] }

这是我正在处理的 JSON 格式。 问题描述

  1. 我想附加文件数据,以便可以向其中添加更多 JSON。为此,我是否需要检查是否已经有一些数据?
  2. 我想在 JSON 文件中附加数据。附加形式的数据将如下所示
[ { “EmpId”:1, “名称”:“考希克”, “名称”:“.net 开发人员”, "加入日期": "09/23/2013", “技能”: [ { “身份证”:1, “技能名称”:“C#” }, { “身份证”:2, “技能名称”:“PHP” }, { “身份证”:3, “技能名称”:“java” } ] }, { “EmpId”:1, “名称”:“考希克”, “名称”:“.net 开发人员”, "加入日期": "09/23/2013", “技能”: [ { “身份证”:1, “技能名称”:“C#” }, { “身份证”:2, “技能名称”:“PHP” }, { “身份证”:3, “技能名称”:“java” } ] } ]

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

我正在逐个字符地读取文件,如下所示:

int count = 0;
EmployeeDetail employee = new EmployeeDetail
{

    EmpId = ++count,
    Name = formCollection["Name"],
    Designation = formCollection["Designation"],
    JoiningDate = formCollection["JoiningDate"],
    Skill = new List<Skills>
                    {
                        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()    

【问题讨论】:

    标签: c# json file-io


    【解决方案1】:

    最好和最可靠的方法是不附加到文件,而是读取整个 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);
    

    如果您是新手,请投票或勾选作为答案,如果我帮助了您。

    【讨论】:

    • 首先感谢您的帮助。 ?? 标记是什么意思?第二次的文件内容是什么?这将是两个json的数组吗?因为我没有完全得到你的解决方案
    • ?? 表示如果 DeserializeObject 函数返回 null(意味着文件可能尚未创建,或者为空),则只需创建一个新的 EmployeeDetail 列表。第二轮的文件内容将节省4名员工。然后是 6 名员工,以此类推……您可能只希望每次添加一名员工,所以只需更改即可。
    • 没问题。很高兴为您提供帮助
    • 我看起来很糟糕。谢谢!
    【解决方案2】:

    FileStream 上有一个 CopyTo 方法。 所以你不需要逐个字符地读取,打开文件流和CopyTo 到响应流。

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

    格式将始终正确,因为您重新保存了整个文件。

    附:您可能无法仅追加,因为文件中的序列化 JSON 对象已“关闭”(您的 } ] 在那里),因此追加文本将不起作用。

    【讨论】:

    • 我必须将文件维护为数据库,每次用户输入记录时,我都会将其保存并显示到主页。所以我需要附加数据。您能否详细说明您的答案,我是 C# 新手,所以我不明白您的意思?
    猜你喜欢
    • 1970-01-01
    • 2016-08-08
    • 1970-01-01
    • 1970-01-01
    • 2013-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多