我有以下JSON
{"KeyValuePairs":{"Gender":"Male","IsDeveloper":true,"Language":"English"},"PreferredLanguage":"C#","PreferredIDE":"Visual Studio","PreferredSourceControl":"Team Foundation Server (TFS)"}
它基于以下类别:
public class DataModel
{
public Dictionary<string, object> KeyValuePairs { get; set; }
public string PreferredLanguage { get; set; }
public string PreferredIDE { get; set; }
public string PreferredSourceControl { get; set; }
public DataModel()
{
KeyValuePairs = new Dictionary<string, object>();
}
}
当我序列化DataModel
的类对象时,我想让它像下面这样:
我之所以将"Gender","IsDeveloper">{"Gender":"Male","IsDeveloper":true,"Language":"English","PreferredLanguage":"C#","PreferredIDE":"Visual Studio","PreferredSourceControl":"Team Foundation Server (TFS)"}
等放在KeyValuePairs中,是因为它是从JSON文件动态生成的(它可以包含"Gender","IsDeveloper"以外的任何内容),而其他属性如"PreferredLanguage","PreferredIDE"和"PreferredSourceControl"则没有
另外,如果实现了上述目标,那么在进行反序列化时,我如何才能将"性别","IsDeveloper"或KeyValuePairs中的任何其他属性放回KeyValuePairs中?
基本上我想将DataModel
类中的所有属性转换为Dictionary<string, object>
对,当属性的返回类型只有基元类型时,Newtonsoft.Json
完美地做到了这一点,但就我而言,我想将KeyValuePairs
设置为Dictionary<string, object>
而不是KeyValuePairs: Dictionary<string, object>
, 而且在进行反序列化时,系统会检测类中是否有属性名称DataModel
它会直接添加到KeyValuePairs
中(例如,"Gender"DataModel
类中不存在,然后在进行反序列化时将其添加到KeyValuePairs
中)
或者有什么方法可以达到同样的目标吗?
谢谢
您可以使用 JsonExtensionData - 指示 JsonSerializer 将没有匹配类成员的属性反序列化到指定的集合中,并在序列化期间写入值。
var json="{"Gender":"Male","IsDeveloper":true,"Language":"English","PreferredLanguage":"C#","PreferredIDE":"Visual Studio","PreferredSourceControl":"Team Foundation Server (TFS)"}";
DataModel dataModel= JsonConvert.DeserializeObject<DataModel>(json);
测试
json=JsonConvert.SerializeObject(dataModel);
创建相同的 JSON
.class
public class DataModel
{
[JsonExtensionData]
public Dictionary<string, object> KeyValuePairs { get; set; }
public string PreferredLanguage { get; set; }
public string PreferredIDE { get; set; }
public string PreferredSourceControl { get; set; }
public DataModel()
{
KeyValuePairs = new Dictionary<string, object>();
}
}
更新
如果你想首先将你的 JSON 转换为规范化,你可以这样做:
var json = "{"KeyValuePairs":{"Gender":"Male","IsDeveloper":true,"Language":"English"},"PreferredLanguage":"C#","PreferredIDE":"Visual Studio","PreferredSourceControl":"Team Foundation Server (TFS)"}";
var jsonParsed = JObject.Parse(json);
foreach (var item in ((JObject)jsonParsed["KeyValuePairs"]).Properties())
jsonParsed.Add(item.Name, item.Value);
jsonParsed.Property("KeyValuePairs").Remove();
json = jsonParsed.ToString();
或者您也可以反序列化 jsonParsed,而不是创建新的 json
DataModel dataModel =jsonParsed.ToObject<DataModel>();