Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Net将内部对象转换为C#模型_C#_Json.net - Fatal编程技术网

Net将内部对象转换为C#模型

Net将内部对象转换为C#模型,c#,json.net,C#,Json.net,我从远程API返回了以下JSON(我无法修改返回的JSON) 现在使用JSON.Net将其转换为一个模型,我必须创建两个模型 public class TicketModel { public string location { get; set; } public string ticket { get; set; } } public class TicketContainer { public Ticke

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

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

  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);
var myObject=JsonConvert.DeserializeObject(this.JSONResponse);

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

修改JSON,使其看起来像这样

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

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

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

因此,您不需要任何模型。

在反序列化之前,使用
Newtonsoft的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;
    }
公共列表JsonParser(字符串json) { Newtonsoft.Json.Linq.JArray JArray=Newtonsoft.Json.Linq.JArray.Parse(Json); var list=新列表(); foreach(jArray中的var项) { 列表。添加( 新的APITicket{location=item[“APITicket”][“location”], 票证=项目[“APITicket”][“票证”] } ); } 退货清单; }
您可以这样做:

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>();
var json=@”
{
“APIPticket”:{
'location':'SOMEVALUE',
“票证”:“SOMEVALUE”
}
}";
//解析JSON:
var jObject=jObject.Parse(json);
//选择嵌套属性(我们只需要一个):
var jProperty=(jProperty)jObject.Children().Single();
//将其值反序列化到TicketModel实例:
var ticket=jProperty.Value.ToObject();

如果您需要在每次API调用之间进行反序列化,那么确实没有办法解决这个问题。您可以在50个API调用返回后批处理反序列化。Hi@SamLeach我有50个不同的API调用,因此这不是大量的调用,而更重要的是创建容器模型时的一个难题,这些容器模型除了反序列化之外没有任何用处!嗨,山姆,我不能修改JSON,因为它是一个外部API。-更新问题以澄清。为什么不?如果返回的是Json,您可以用它做任何事情。
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>();