我正在安装软件,我添加了配置文件功能,用户可以创建配置文件以轻松加载其信息。为了存储这些信息,我使用的是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...
}
}
答案 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>();
}