Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.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
C# 当第一项是要跟随的项的计数时,如何反序列化对象数组_C#_Json_Json.net - Fatal编程技术网

C# 当第一项是要跟随的项的计数时,如何反序列化对象数组

C# 当第一项是要跟随的项的计数时,如何反序列化对象数组,c#,json,json.net,C#,Json,Json.net,我在将json反序列化为c#对象时遇到以下问题 我有一个json字符串,类似这样: string data = @"{ 'response': [ 3, { 'id': 1, 'name': 'john' }, { 'id': 1, 'name'

我在将json反序列化为c#对象时遇到以下问题

我有一个json字符串,类似这样:

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中删除它,您就可以了