C# 序列化并向json添加多个项

C# 序列化并向json添加多个项,c#,json,methods,C#,Json,Methods,我需要以json格式将多个项目添加到.txt文件中。我有一个方法,可以将ClienteModel对象添加到.txt,它可以工作。这是我的clientmodel课程: public class ClienteModel { public int IDCliente { get; set; } public string Cognome { get; set; } public string Nome { get; set; } public string Indir

我需要以json格式将多个项目添加到.txt文件中。我有一个方法,可以将ClienteModel对象添加到.txt,它可以工作。这是我的
clientmodel
课程:

public class ClienteModel
{
    public int IDCliente { get; set; }
    public string Cognome { get; set; }
    public string Nome { get; set; }
    public string Indirizzo { get; set; }
}
这是我的方法:(由于我必须设置一个渐进id,所以工作正在进行中)

这是一个有效的json,但如果我尝试附加另一个对象:

{"IDCliente":0,"Cognome":"a","Nome":"a","Indirizzo":"a"}{"IDCliente":0,"Cognome":"b","Nome":"bb","Indirizzo":"b"}{"IDCliente":0,"Cognome":"cc","Nome":"cc","Indirizzo":"cc"}
这不是一个有效的格式


我不熟悉json,我的项目使用列表,我正在重新设计它。我该怎么办?

错误是因为您正在向无效的JSON数组添加另一个JSON元素。文件的内容必须遵循架构:

[{content},{另一个content}]

就像外面的任何人一样。 如何从处理JSON数组的文本中序列化和反序列化JSON

model.IDCliente = StartID;
var fileName = @"D:\AnagraficaClientiJsonMemory\clienti.txt";
var fileContent = File.ReadAllText(fileName);
var models = JsonConvert.DeserializeObject<List<ClienteModel>>(fileContent);
models.Add(model);
File.WriteAllText (fileName, JsonConvert.SerializeObject(models));
MessageBox.Show("Cliente aggiunto correttamente.");
model.IDCliente=StartID;
var fileName=@“D:\AnagraficaClientiJsonMemory\clienti.txt”;
var fileContent=File.ReadAllText(文件名);
var models=JsonConvert.DeserializeObject(fileContent);
模型。添加(模型);
File.WriteAllText(文件名,JsonConvert.SerializeObject(模型));
MessageBox.Show(“客户aggiunto corretmente.”);
这样,您就可以对模型进行任何其他处理。另一种方法是读取文件内容,查找JSON(']')的结束字符,并在之前添加新的JSON。

,零或多个值的有序序列

您可以将客户机列表表示为JSON数组,如下所示

[  
    {"IDCliente": 0, "Cognome": "a", "Nome": "a", "Indirizzo": "a"},
    {"IDCliente": 0, "Cognome": "b", "Nome": "bb", "Indirizzo": "b"},
    {"IDCliente": 0, "Cognome": "cc", "Nome": "cc", "Indirizzo": "cc"}
]
一个重要的注意事项是,您不应该(我的真正意思是)将序列化和反序列化与纯文本操作(如
AppendAllText
)结合起来。你认为这是可行的可能会导致严重的混乱。一旦您这样做了,当涉及到结果数据是否有效以及是否可以反序列化时,所有的赌注都将被取消

您所做的是绕过序列化程序的API,创建自己的API,添加聚合的hoc表示,并生成无效的JSON

这适用于任何数据格式,而不仅仅是JSON

相反,利用序列化程序API公开的JSON数组支持

public async Task SaveClienteAsync(ClienteModel model)
{
    var path = @"D:\AnagraficaClientiJsonMemory\clienti.txt";
    var json = await File.ReadAllTextAsync(path);

    var deserializedClientes = json.Trim().Length == 0
        ? JsonConvert.DeserializeObject<IEnumerable<ClienteModel>>(json)
        : Enumerable.Empty<ClienteModel>();

    var toSerialize = deserializedClientes.Append(model);
    var updatedJson = JsonConvert.SerializeObject(toSerialize);
    
    await File.WriteAllTextAsync(path, updatedJson, Encoding.UTF8);

    MessageBox.Show("Cliente aggiunto correttamente.");
}
公共异步任务saveclientasync(ClienteModel模型)
{
var path=@“D:\AnagraficaClientiJsonMemory\clienti.txt”;
var json=await File.ReadAllTextAsync(路径);
var DeserializedClient=json.Trim().Length==0
?JsonConvert.DeserializeObject(json)
:Enumerable.Empty();
var toSerialize=反序列化客户端.Append(模型);
var updatedJson=JsonConvert.SerializeObject(toSerialize);
wait File.WriteAllTextAsync(路径,updatedJson,Encoding.UTF8);
MessageBox.Show(“客户aggiunto corretmente.”);
}

注意,按照惯例,您应该强烈考虑使用<代码> .JSON/COD>文件扩展名,以指示该文件包含格式化为JSON而不是任意文本的结构化数据:<代码> @“D:\ANAGRAFICACILITENJSONSONDS\CclitI.JSON”< /Cord>

您希望JSON数组按其声音<代码> [{…},{}} > <代码> >。只需将对象放入数组,然后调用

SerializeObject
即可。哦,很高兴知道,但我不知道这是否可行。该方法将通过单击调用,这将从文本框中获取信息,因此我需要将每一项添加到json文件中。正如您所建议的,我需要为每个ClienteModel模型创建一个数组,它不是面向对象的。System.IO.File不包含Netstanard 2.1中WriteAllTextAsync/ReadAllTextAsync?@paranoidcoder的定义。如果你的目标是。NET 4.8,您可能需要安装nuget软件包或使用不同的机制来读取该文件。我会在有时间的时候调查一下并更新答案
[  
    {"IDCliente": 0, "Cognome": "a", "Nome": "a", "Indirizzo": "a"},
    {"IDCliente": 0, "Cognome": "b", "Nome": "bb", "Indirizzo": "b"},
    {"IDCliente": 0, "Cognome": "cc", "Nome": "cc", "Indirizzo": "cc"}
]
public async Task SaveClienteAsync(ClienteModel model)
{
    var path = @"D:\AnagraficaClientiJsonMemory\clienti.txt";
    var json = await File.ReadAllTextAsync(path);

    var deserializedClientes = json.Trim().Length == 0
        ? JsonConvert.DeserializeObject<IEnumerable<ClienteModel>>(json)
        : Enumerable.Empty<ClienteModel>();

    var toSerialize = deserializedClientes.Append(model);
    var updatedJson = JsonConvert.SerializeObject(toSerialize);
    
    await File.WriteAllTextAsync(path, updatedJson, Encoding.UTF8);

    MessageBox.Show("Cliente aggiunto correttamente.");
}