将json置于一个子级对象中



假设我有这个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;
    }    
    ...
}

相关内容

  • 没有找到相关文章

最新更新