AppendAllText生成无效的JSON

时间:2014-02-20 23:45:38

标签: c# asp.net-mvc json

我有一个JSON文件,其中包含:

[{
    "title":"Colors",
    "text":"1. White 2. Blue 3. Red 4. Yellow 5. Green"
}]

如果我使用

string json = JsonConvert.SerializeObject(favecolors, Formatting.Indented);
var jsonFile= Server.MapPath("~/App_Data/favecolors.json");
System.IO.File.AppendAllText(@jsonFile, ","+json);

我可以将JSON对象附加到文件中,结果是:

[{
    "title":"Colors",
    "text":"1. White 2. Blue 3. Red 4. Yellow 5. Green"
}],{
    "title":"Colors",
    "text":"1. White 2. Blue 3. Red 4. Yellow 5. Green"
}

这是无效的JSON,因为右方括号位于错误的位置。有人可以帮忙吗?

2 个答案:

答案 0 :(得分:0)

如果文件的json的格式总是相同的,那么在这种情况下,至少有一个节点[{},{}]的json数组可以这样做

var jsonFile = Server.MapPath("~/App_Data/favecolors.json");
FileStream fs = new FileStream(@jsonFile, FileMode.Open, FileAccess.ReadWrite);
fs.SetLength(fs.Length - 1); // Remove the last symbol ']'
fs.Close();
string json = JsonConvert.SerializeObject(favecolors, Formatting.Indented);
System.IO.File.AppendAllText(@jsonFile, "," + json + "]");

这不是最优雅的解决方案,但它应该让你想做。

注意:此解决方案非常棘手,请确保文件内容以“]”符号结尾,否则您宁愿执行以下操作:1)将文件读入var,2)连接新json (正确拟合),3)用合并的json写入文件。

答案 1 :(得分:0)

您可以尝试更通用的内容,而不是添加/删除结束括号。希望以下示例符合您的需求。

[JsonObject]
public class FavoriteColor
{
    public FavoriteColor()
    {}

    public FavoriteColor(string title, string text)
    {
        Title = title;
        Text = text;
    }

    [JsonProperty(PropertyName = "title")]
    public string Title { get; set; }

    [JsonProperty(PropertyName = "text")]
    public string Text { get; set; }
}

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    // Append new objects to your file
    private async Task Append()
    {
        // Read file content and deserialize
        string content = await ReadAsync("json.txt");

        var colors = new List<FavoriteColor>();
        if (!string.IsNullOrWhiteSpace(content))
            colors.AddRange(JsonConvert.DeserializeObject<List<FavoriteColor>>(content));

        // Add your new favorite color!
        var fav = new FavoriteColor("new", "new color");
        colors.Add(fav);

        // Writo back to file
        await WriteAsync("json.txt", JsonConvert.SerializeObject(colors));
    }

    // Async read
    private async Task<string> ReadAsync(string file)
    {
        if (!File.Exists(file))
            return null;

        string content;
        using (var fileStream = File.OpenRead(file))
        {
            byte[] buffer = new byte[fileStream.Length];
            await fileStream.ReadAsync(buffer, 0, (int)fileStream.Length);
            content = Encoding.UTF8.GetString(buffer);
        }
        return content;
    }

    // Async write
    private async Task WriteAsync(string file, string content)
    {
        using (var fileStream = File.OpenWrite(file))
        {
            byte[] buffer = (new UTF8Encoding()).GetBytes(content);
            await fileStream.WriteAsync(buffer, 0, buffer.Length);
        }
    }
}