将对象添加到JSON文件

时间:2019-07-13 19:04:20

标签: c# json

我正在安装软件,我添加了配置文件功能,用户可以创建配置文件以轻松加载其信息。为了存储这些信息,我使用的是JSON文件,其中包含的对象与配置文件一样多。

这是包含配置文件时的JSON文件格式(不是实际的,而是一个简短的示例):

{
  "Profile-name": {
    "form_email": "example@example.com",
    //Many other informations...
  }
}

这是我用来编写JSON及其内容的代码:

string json = File.ReadAllText("profiles.json");
                    dynamic profiles = JsonConvert.DeserializeObject(json);
                    if (profiles == null)
                    {
                        File.WriteAllText(jsonFilePath, "{}");
                        json = File.ReadAllText(jsonFilePath);
                        profiles = JsonConvert.DeserializeObject<Dictionary<string, Profile_Name>>(json);
                    }
                    profiles.Add(profile_name.Text, new Profile_Name { form_email = form_email.Text });
                    var newJson = JsonConvert.SerializeObject(profiles, Formatting.Indented);
                    File.WriteAllText(jsonFilePath, newJson);
                    profile_tr.Nodes.Add(profile_name.Text, profile_name.Text);
                    debug_tb.Text += newJson;

但是它不起作用:当profiles.json文件完全为空时,则成功写入了配置文件,但是当我试图添加已经存在另一个配置文件的配置文件时,出现此错误: The best overloaded method match for 'Newtonsoft.Json.Linq.JObject.Add(string, Newtonsoft.Json.Linq.JToken)' has some invalid arguments行上的profiles.Add();。 顺便说一句,您会注意到,如果文件为空,我需要使用简单的方法在文件中添加{},也许它具有链接?所以我的预期输出是:

{
  "Profile-name": {
    "form_email": "example@example.com",
    //Many other informations...
  },
  "Second-profile": {
    "form_email": "anotherexample@example.com"
    //Some other informations...
  }
}

2 个答案:

答案 0 :(得分:0)

好的,所以我再次阅读代码发现,所以我只是将dynamic profiles = JsonConvert.DeserializeObject(json);替换为dynamic profiles = JsonConvert.DeserializeObject<Dictionary<string, Profile_Name>>(json);。 但这仍然无法解决我用来将{}添加到文件中的非平凡方式...

答案 1 :(得分:0)

第一个DeserializeObject方法返回的对象实际上是一个JObject,但在下面您将其反序列化为Dictionary。您不应该混合使用任何一种类型。

如果使用JObject然后添加对象,则需要将其转换为JObjects:

profiles.Add(profile_name.Text, JObject.FromObject(new Profile_Name { form_email = form_email.Text }));

在两种情况下,如果配置文件为null,则只需对其进行初始化:

if (profiles == null)
{
    profiles = new JObject(); // or new Dictionary<string, Profile_Name>();
}