JSON 序列化返回类型,而不是返回类型的属性



我有以下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":"Male","IsDeveloper":true,"Language":"English","PreferredLanguage":"C#","PreferredIDE":"Visual Studio","PreferredSourceControl":"Team Foundation Server (TFS)"}

我之所以将"Gender","IsDeveloper">

等放在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>();

最新更新