假设我有这个json:
{
"Success": true,
"Records": [
{
"f_EMail": "test@me.com",
"f_FirstName": "firstname",
"f_LastName": "lastname",
"f_Country": null
},
{
"f_EMail": "test2@me.com",
"f_FirstName": "firstname2",
"f_LastName": "lastname2",
"f_Country": null
}
]
}
我的班级看起来像这样:
public class Result
{
public bool Success { get; set; }
public IEnumrable<Dictionary<string, string>> Records { get; set; }
}
一切都按预期工作。但是我想以不同的方式写出我的班级,并将这些值放入Record.Data
中,如下所示。我需要找到一种读取和写入此模型的方法,因为某些值是众所周知的,我想更直接地访问它们。
public class Result
{
public bool Success { get; set; }
public IEnumerable<Record> Records { get; set; }
}
public class Record
{
public Dictionary<string, string> Data { get; set; }
public string Email
{
get
{
return Data[KnownRecordField.Email];
}
}
public string FirstName
{
get
{
return Data[KnownRecordField.FirstName];
}
}
...
}
我该怎么做?
如果您愿意将词典声明为 Dictionary<string, object>
而不是 Dictionary<string, string>
,则可以利用json.net的"扩展数据"功能来处理此功能。
- 用
[JsonExtensionData]
属性标记字典。 - 为所有众所周知的值制作属性,并给予它们与JSON属性名称相对应的
[JsonProperty]
属性。
众所周知的JSON属性将在同类的各自成员中进行,而其余的所有值将进入字典中。
public class Record
{
[JsonExtensionData]
public Dictionary<string, object> Data { get; set; }
[JsonProperty("f_EMail")]
public string Email { get; set; }
[JsonProperty("f_FirstName")]
public string FirstName { get; set; }
...
}
小提琴:https://dotnetfiddle.net/hgz1v7
如果您想要 asl 要进入字典的值(不仅是未知字典),您仍然可以使用[JsonExtensionData]
属性,然后使用单独的属性来读取和写入众所周知的值直接来自字典。确保用[JsonIgnore]
标记属性,以避免在序列化过程中潜在的冲突。
public class Record
{
[JsonExtensionData]
public Dictionary<string, object> Data { get; set; }
[JsonIgnore]
public string Email
{
get { return GetDataValue(KnownRecordField.Email); }
set { Data[KnownRecordField.Email] = value; }
}
[JsonIgnore]
public string FirstName
{
get { return GetDataValue(KnownRecordField.FirstName); }
set { Data[KnownRecordField.FirstName] = value; }
}
// use this method to avoid an exception if the well-known value
// isn't present in the dictionary
private string GetDataValue(string key)
{
object value;
return Data.TryGetValue(key, out value) && value != null ? value.ToString() : null;
}
}
public static class KnownRecordField
{
public static readonly string Email = "f_EMail";
public static readonly string FirstName = "f_FirstName";
}
小提琴:https://dotnetfiddle.net/i04omm
您可以在记录类中添加JsonProperty
属性。
public class Record
{
public Dictionary<string, string> Data { get; set; }
[JsonProperty(PropertyName = "f_EMail")]
public string Email
{
get;set;
}
...
}