【问题标题】:JSON.Net Convert inner object to C# ModelJSON.Net 将内部对象转换为 C# 模型
【发布时间】:2018-07-10 23:48:01
【问题描述】:

我从远程 API 返回以下 JSON(我无法修改返回的 JSON)

{
    "APITicket": {
        "location": "SOMEVALUE",
        "ticket": "SOMEVALUE"
    }
}

现在使用 JSON.Net 将其转换为模型,我必须创建 2 个模型。

  public class TicketModel
    {
        public string location { get; set; }
        public string ticket { get; set; }
    }

    public class TicketContainer
    {
        public TicketModel APITicket { get; set; } 
    }

然后做类似的事情..

var myObject = JsonConvert.DeserializeObject<TicketContainer>(this.JSONResponse);

这很好用——当我对 API 进行大约 50 次调用并且真的不想为每个调用创建第二个“容器”时,我的问题就出现了。有没有办法将上面的示例直接绑定到 TicketModel?

【问题讨论】:

  • 如果您需要在每个 API 调用之间进行反序列化,那么确实没有办法解决这个问题。您可以在 50 个 API 调用返回后批量反序列化。
  • 嗨 @SamLeach 我有 50 个不同的 API 调用,所以这不是调用的数量,而是创建容器模型时的痛苦,除了反序列化之外,它对任何东西都没有用处!

标签: c# json.net


【解决方案1】:

你可以这样做:

var json = @"
            {
                'APITicket': {
                    'location': 'SOMEVALUE',
                    'ticket': 'SOMEVALUE'
                }
            }";

//Parse the JSON:
var jObject = JObject.Parse(json);

//Select the nested property (we expect only one):
var jProperty = (JProperty)jObject.Children().Single();

//Deserialize it's value to a TicketModel instance:
var ticket = jProperty.Value.ToObject<TicketModel>();

【讨论】:

    【解决方案2】:

    使用Newtonsoft's JArray在反序列化之前自定义你的json

    public List<APITicket> JsonParser(string json)   
        {
            Newtonsoft.Json.Linq.JArray jArray = Newtonsoft.Json.Linq.JArray.Parse(json);
    
            var list = new List<APITicket>();
    
            foreach(var item in jArray)
            {
                list.Add(
                    new APITicket { location = item["APITicket"]["location"],
                                    ticket =   item["APITicket"]["ticket"]            
                    }
                );
            }
            return list;
        }
    

    【讨论】:

      【解决方案3】:

      修改 JSON 使其看起来像这样

      {
          "location": "SOMEVALUE",
          "ticket": "SOMEVALUE"
      }
      

      然后做

      List<TicketModel> tickets = JsonConvert.DeserializeObject<List<TicketModel>>(this.JSONResponse);
      

      甚至

      Dictionary<string, string> tickets = JsonConvert.DeserializeObject<Dictionary<string, string>>(this.JSONResponse);
      

      所以你不需要任何模型。

      【讨论】:

      • 嗨 Sam,我无法修改 JSON,因为它是一个外部 API。 - 更新问题以澄清。
      • 为什么不呢?如果它返回 Json,你可以用它做你想做的事。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-01
      • 2014-03-26
      • 1970-01-01
      • 2013-04-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多