C# 当第一项是要跟随的项的计数时,如何反序列化对象数组
我在将json反序列化为c#对象时遇到以下问题 我有一个json字符串,类似这样:C# 当第一项是要跟随的项的计数时,如何反序列化对象数组,c#,json,json.net,C#,Json,Json.net,我在将json反序列化为c#对象时遇到以下问题 我有一个json字符串,类似这样: string data = @"{ 'response': [ 3, { 'id': 1, 'name': 'john' }, { 'id': 1, 'name'
string data =
@"{
'response':
[
3,
{
'id': 1,
'name': 'john'
},
{
'id': 1,
'name': 'john'
},
{
'id': 1,
'name': 'john'
}
]
}";
和用于反序列化的类:
class Response
{
[JsonProperty(PropertyName = "response")]
Item[] Items {get; set; }
}
class Item
{
[JsonProperty(PropertyName = "id")]
public int Id{get; set; }
[JsonProperty(PropertyName = "name")]
public int Id{get; set; }
}
然后我尝试将其反序列化:
var res = JsonConvert.DeserializeObject<Response>(data);
var res=JsonConvert.DeserializeObject(数据);
反序列化引发异常,并显示以下消息:“将值3转换为类型“Item”时出错。路径“response[0]”,第1行,位置19。”
显然,这是因为数据字符串中的数组“response”包含描述响应长度的文本“3”。我想知道,我是否可以在不编写自定义反序列化逻辑的情况下,仅通过json.net正确地进行反序列化?还是需要创建自定义反序列化逻辑 首先,你的模型应该稍微修正一下
public class Response
{
[JsonProperty(PropertyName = "response")]
Item[] Items { get; set; }
}
public class Item
{
[JsonProperty(PropertyName = "id")]
public int Id { get; set; }
[JsonProperty(PropertyName = "name")]
public string Name { get; set; }
}
如果从json中删除3
,此反序列化将正常工作
var result = JsonConvert.DeserializeObject<Response>(json);
首先,你的模型应该修正一点
public class Response
{
[JsonProperty(PropertyName = "response")]
Item[] Items { get; set; }
}
public class Item
{
[JsonProperty(PropertyName = "id")]
public int Id { get; set; }
[JsonProperty(PropertyName = "name")]
public string Name { get; set; }
}
如果从json中删除3
,此反序列化将正常工作
var result = JsonConvert.DeserializeObject<Response>(json);
首先,你的模型应该修正一点
public class Response
{
[JsonProperty(PropertyName = "response")]
Item[] Items { get; set; }
}
public class Item
{
[JsonProperty(PropertyName = "id")]
public int Id { get; set; }
[JsonProperty(PropertyName = "name")]
public string Name { get; set; }
}
如果从json中删除3
,此反序列化将正常工作
var result = JsonConvert.DeserializeObject<Response>(json);
首先,你的模型应该修正一点
public class Response
{
[JsonProperty(PropertyName = "response")]
Item[] Items { get; set; }
}
public class Item
{
[JsonProperty(PropertyName = "id")]
public int Id { get; set; }
[JsonProperty(PropertyName = "name")]
public string Name { get; set; }
}
如果从json中删除3
,此反序列化将正常工作
var result = JsonConvert.DeserializeObject<Response>(json);
另一种方式,
class Response
{
[JsonProperty(PropertyName = "response")]
public dynamic Items { get; set; }
}
var des = JsonConvert.DeserializeObject<Response>(data);
var result = (des.Items as IEnumerable<Newtonsoft.Json.Linq.JToken>)
.Select(delegate(JToken j){
if (j.Type == JTokenType.Integer)
return j.Value<int>();
return JsonConvert.DeserializeObject<object>(j.ToString());
}).ToList();
var one = JsonConvert.DeserializeObject<Item>(result[1].ToString());
类响应
{
[JsonProperty(PropertyName=“response”)]
公共动态项{get;set;}
}
var des=JsonConvert.DeserializeObject(数据);
变量结果=(des.Items为IEnumerable)
.选择(代表(JToken j){
if(j.Type==JTokenType.Integer)
返回j.Value();
返回JsonConvert.DeserializeObject(j.ToString());
}).ToList();
var one=JsonConvert.DeserializeObject(结果[1].ToString());
另一种方法
class Response
{
[JsonProperty(PropertyName = "response")]
public dynamic Items { get; set; }
}
var des = JsonConvert.DeserializeObject<Response>(data);
var result = (des.Items as IEnumerable<Newtonsoft.Json.Linq.JToken>)
.Select(delegate(JToken j){
if (j.Type == JTokenType.Integer)
return j.Value<int>();
return JsonConvert.DeserializeObject<object>(j.ToString());
}).ToList();
var one = JsonConvert.DeserializeObject<Item>(result[1].ToString());
类响应
{
[JsonProperty(PropertyName=“response”)]
公共动态项{get;set;}
}
var des=JsonConvert.DeserializeObject(数据);
变量结果=(des.Items为IEnumerable)
.选择(代表(JToken j){
if(j.Type==JTokenType.Integer)
返回j.Value();
返回JsonConvert.DeserializeObject(j.ToString());
}).ToList();
var one=JsonConvert.DeserializeObject(结果[1].ToString());
另一种方法
class Response
{
[JsonProperty(PropertyName = "response")]
public dynamic Items { get; set; }
}
var des = JsonConvert.DeserializeObject<Response>(data);
var result = (des.Items as IEnumerable<Newtonsoft.Json.Linq.JToken>)
.Select(delegate(JToken j){
if (j.Type == JTokenType.Integer)
return j.Value<int>();
return JsonConvert.DeserializeObject<object>(j.ToString());
}).ToList();
var one = JsonConvert.DeserializeObject<Item>(result[1].ToString());
类响应
{
[JsonProperty(PropertyName=“response”)]
公共动态项{get;set;}
}
var des=JsonConvert.DeserializeObject(数据);
变量结果=(des.Items为IEnumerable)
.选择(代表(JToken j){
if(j.Type==JTokenType.Integer)
返回j.Value();
返回JsonConvert.DeserializeObject(j.ToString());
}).ToList();
var one=JsonConvert.DeserializeObject(结果[1].ToString());
另一种方法
class Response
{
[JsonProperty(PropertyName = "response")]
public dynamic Items { get; set; }
}
var des = JsonConvert.DeserializeObject<Response>(data);
var result = (des.Items as IEnumerable<Newtonsoft.Json.Linq.JToken>)
.Select(delegate(JToken j){
if (j.Type == JTokenType.Integer)
return j.Value<int>();
return JsonConvert.DeserializeObject<object>(j.ToString());
}).ToList();
var one = JsonConvert.DeserializeObject<Item>(result[1].ToString());
类响应
{
[JsonProperty(PropertyName=“response”)]
公共动态项{get;set;}
}
var des=JsonConvert.DeserializeObject(数据);
变量结果=(des.Items为IEnumerable)
.选择(代表(JToken j){
if(j.Type==JTokenType.Integer)
返回j.Value();
返回JsonConvert.DeserializeObject(j.ToString());
}).ToList();
var one=JsonConvert.DeserializeObject(结果[1].ToString());
您的json不是预期的格式。数组中的数字3被视为一个成员,而它可能表示数组的长度。json反序列化程序错误地解释了它。如果将其从JSON中删除,您将确认您的JSON不是预期的格式。数组中的数字3被视为一个成员,而它可能表示数组的长度。json反序列化程序错误地解释了它。如果将其从JSON中删除,您将确认您的JSON不是预期的格式。数组中的数字3被视为一个成员,而它可能表示数组的长度。json反序列化程序错误地解释了它。如果将其从JSON中删除,您将确认您的JSON不是预期的格式。数组中的数字3被视为一个成员,而它可能表示数组的长度。json反序列化程序错误地解释了它。如果您从JSON中删除它,您就可以了