Net将内部对象转换为C#模型
我从远程API返回了以下JSON(我无法修改返回的JSON) 现在使用JSON.Net将其转换为一个模型,我必须创建两个模型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
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>();