【问题标题】:Split field when deserializing JSON object反序列化 JSON 对象时拆分字段
【发布时间】:2014-12-23 19:55:43
【问题描述】:

我在 JSON 中有这个(数据更改以保护有罪者):

    {"members" : [{"Name":"Mick Jagger","Status":"ACTIVE","ExpireDate":"11/19/2015","TermType":"MONTH","State":"NY","Address2":"","Address1":"123 Anystreet","Type":"PREMIUM","EmailAddress":"mick.jagger@stickyfingers.com","Zip":"12345","Country":"US","City":"New York","Term":"12"},
{"Name":"Keith Richards","Status":"ACTIVE","ExpireDate":"11/19/2015","TermType":"ANNUAL","State":"CT","Address2":"","Address1":"5150 Main St","Type":"PREMIUM","EmailAddress":"keef@xpensivewinos.net","Zip":"45678","Country":"US","City":"New York","Term":"1"}]}

我有这门课:

public class Member
{
    public string Company_Num { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string Status { get; set; }
    public string  ExpireDate { get; set; }
    public string TermType { get; set; }
    public string State { get; set; }
    public string Address2 { get; set; }
    public string Address1 { get; set; }
    public string Type { get; set; }
    public string EmailAddress { get; set; }
    public string Zip { get; set; }
    public string Country { get; set; }
    public string City { get; set; }
    public string Term { get; set; }
}

public class MemberList
{
    public List<Member> members { get; set; }
}

当我将其反序列化为数据集时,它运行良好。但是……

当我生成 MemberList 类时,我忘记了 JSON 中的“Name”需要拆分为 FirstName 和 LastName。有没有办法同时反序列化 JSON 对象并拆分“名称”? (所以 FirstName 是“Keith”,LastName 是“Richards”等等。)

以下是我将其反序列化为 MemberList 时的样子:

public static MemberList memList()
    {            
        WebClient atv = new WebClient();
        var data = atv.DownloadString("https://www.somewebsvc.com/memberships");
        MemberList m = Newtonsoft.Json.JsonConvert.DeserializeObject<MemberList>(data);
        return m;
    }

【问题讨论】:

  • 你将如何用多个单词分割名字?我认为您应该重新考虑拆分它们
  • 我们已经确定了如何处理。我对此并不满意,但这正是客户想要的。
  • 您可以创建两个字段,然后在 getter 中随意拆分 Name
  • 是的。一旦我将新字段放入其中,foreach 循环就会自行编写。没有什么比公开卑躬屈膝更能动脑筋的了。

标签: c# json json.net


【解决方案1】:

一种可能的解决方案是在模型中创建字段,以便在获取它们时返回所需的值:

public class Member
{
     //other properties
     private string _lastName;
     public string LastName {get 
     {
       if (_lastName == null)
           _lastName = Name.Split(new [] {' '}, 2)[1];
       return _lastName;
     }}

     private string _firstName;
     public string FirstName {get 
     {
        if (_firstName== null)
           _firstName= Name.Split(new [] {' '}, 2)[0];
       return _firstName;
     }}
}

【讨论】:

  • 或者类似地创建一个 Name 属性,它实际上是 FirstName 和 LastName 成员变量的前端。 JSON 反序列化将调用其设置器。
【解决方案2】:

这是一个你一问问题就想明白的例子。

我向 Members 添加了一个 Name 属性,然后在代码返回列表之前添加了一个 foreach 循环。所以现在看起来像这样:

public static MemberList memList()
{            
    WebClient atv = new WebClient();
    var data = atv.DownloadString("https://www.somewebsvc.com/memberships");
    MemberList m = Newtonsoft.Json.JsonConvert.DeserializeObject<MemberList>(data);
    foreach (Member mb in m.members)
        {
            string[] names = mb.Name.Split(new char[] { ' ' }, 2);
            mb.FirstName = names[0];
            mb.LastName = names[1];
        }
    return m;
}

正如 cmets 中所指出的,当您必须解析“Mary Ann Smith”或“Nigel Baxter Taylor”时,这非常难看,但您几乎可以在其中插入任何字符串解析逻辑并且它会起作用。客户只想要名字的第一个单词。如果这能让他们开心,我不会争论。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-27
    • 1970-01-01
    • 1970-01-01
    • 2021-01-19
    相关资源
    最近更新 更多