Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/314.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 - Fatal编程技术网

C# 反序列化泛型类型无法正常工作

C# 反序列化泛型类型无法正常工作,c#,json,C#,Json,我使用下面的方法来反序列化json对象 public static T DeserializeJson<T>(string Json) { if (CanDesirialize(Json)) { return JsonConvert.DeserializeObject<T>(Json); } return (T)new object(); } 它不起作用: 异常“需要数组对象” 我试图在反序列化方法中捕获T类型,并检

我使用下面的方法来反序列化json对象

public static T DeserializeJson<T>(string Json)
{
    if (CanDesirialize(Json))
    {
          return JsonConvert.DeserializeObject<T>(Json);
    }

    return (T)new object();
}
它不起作用:

异常“需要数组对象”

我试图在反序列化方法中捕获T类型,并检查IsArray属性,结果返回false


出于某种原因,我仍然没有发现我的代码中有任何错误

这里使用数组没有固有的问题。下面是从您的代码中挤出的一个完全有效的示例:

using Newtonsoft.Json;
using System;    
class P {
    static void Main() {
        var obj = new P(@"[ { ""Name"":""Fred"" }, { ""Name"":""Wilma"" } ]");
        var people = obj.ExecuteService<People[]>();
        foreach (var person in people) {
            Console.WriteLine(person.Name);
        }
    }
    public P(string rslt) { this.rslt = rslt; }
    private readonly string rslt;
    public T ExecuteService<T>()
    {
        // call service
        return DeserializeJson<T>(rslt);
    }

    public static T DeserializeJson<T>(string Json)
    {
        if (CanDesirialize(Json))
        {
            return JsonConvert.DeserializeObject<T>(Json);
        }

        return (T)new object();
    }

    private static bool CanDesirialize(string json) => true;
}
public class People {
    public string Name { get; set; }
}
使用Newtonsoft.Json;
使用制度;
P类{
静态void Main(){
var obj=newp(@“[{”“Name”“:”“Fred”“},{”“Name”“:”“Wilma”“}]”);
var people=obj.ExecuteService();
foreach(人与人之间的变量){
Console.WriteLine(person.Name);
}
}
公共P(字符串rslt){this.rslt=rslt;}
私有只读字符串rslt;
公共T执行服务()
{
//呼叫服务
返回反序列化JSON(rslt);
}
公共静态T反序列化Json(字符串Json)
{
if(CanDesirialize(Json))
{
返回JsonConvert.DeserializeObject(Json);
}
返回(T)新对象();
}
私有静态boolcondesirialize(字符串json)=>true;
}
公营阶层人士{
公共字符串名称{get;set;}
}

因此:如果您的代码不起作用,那么问题几乎肯定出在您特定的json和对象模型中。其中:我们没有。

您的代码唯一的问题是这一行:

return (T)new object();
无法将对象强制转换为人员[]。相反,请尝试以下方法:

return default(T);

“它不起作用”-什么不起作用?抛出该异常是什么?这可能是您抛出错误的
CanDesirialize
方法吗?或者是
jsonvert
?调用
return(T)new object()
是因为
CanDesirialize
returned
false
?因为该转换实际上永远不会起作用(除非
T
object
)。json字符串实际上看起来像数组吗?或者简明扼要地说:您是否可以显示一个我们实际可以运行的最小复制程序来演示这一点?@marcGravel its
JsonConvert.DeserializeObject(Json)我在这上面打电话给骗子one@buff好啊现在什么是
Json
?它甚至是远程数组吗?例外情况是它无法将json数组反序列化为对象。但我无法理解的是,当我直接将people[]传递给方法
(var rslt=DeserializeJson(json);
时,people[]转换成people的方式。但是当我在Execute方法中传递people[]时(
Execute()
)使用反序列化方法上的断点并检查其返回的人员对象(单个对象)的T类型即使我通过了考试array@buff请编辑您的问题,以包含示例代码(如上面我的示例中的代码),该示例代码实际显示了这种情况。在此之前,几乎不可能理解您的不同做法。问题出在您未发布的代码中。@buff注意,我编辑了上面的代码,以将我们也包括在内从代码中删除
ExecuteService()
的年龄;它仍然可以完美地工作
return (T)new object();
return default(T);