Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/272.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.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# JSON反序列化。_C#_.net_Json.net_Deserialization - Fatal编程技术网

C# JSON反序列化。

C# JSON反序列化。,c#,.net,json.net,deserialization,C#,.net,Json.net,Deserialization,我有一个简单的WCF RESTful服务,只有一个操作,它的参数是字符串void进程(字符串项)。项是一个JSON序列化对象,它可以是任何东西 在这种特殊情况下,可以向该服务发送大约20个不同的类。什么是反序列化这些对象的适当且方便的方法?我怎么知道JSON背后到底是什么?我可以包含一些类型字段,并执行类似于使用Json.NET的操作: dynamic json = JsonConvert.DeserializeObject(input); ,检查json.Type,然后使用JsonConve

我有一个简单的WCF RESTful服务,只有一个操作,它的参数是字符串
void进程(字符串项)
是一个JSON序列化对象,它可以是任何东西

在这种特殊情况下,可以向该服务发送大约20个不同的类。什么是反序列化这些对象的适当且方便的方法?我怎么知道JSON背后到底是什么?我可以包含一些
类型
字段,并执行类似于使用Json.NET的操作:

dynamic json = JsonConvert.DeserializeObject(input);

,检查
json.Type
,然后使用
JsonConvert.DeserializeObject()
反序列化输入字符串,但我不确定这是否是个好主意。你有什么想法吗?

尽管我会在评论中提到的许多OperationContract方法中使用WCF,但动态方法也是可能的。别忘了,很多检查都被省略了,还有很多地方需要改进。把它看作是PoC工作。

假设您有一个要在其上执行方法的服务器对象

public class ServerClass1
{
    public int Add(int i,int j)
    {
        return i + j; 
    }

    public string Hello()
    {
        return "HELLO";
    }
}
您以某种方式接收这些JSON并动态执行

req1:
{“方法”:“添加”,“参数”:[3,5]}

var res1 = Exec(req1, new ServerClass1());
请求2:
{“方法”:“你好”,“参数”:null}

var res2 = Exec(req2, new ServerClass1());
助手方法/类

public class Request
{
    public string method;
    public object[] parameters;
}

public static object Exec(string json, object target)
{
    var req = JsonConvert.DeserializeObject<Request>(json);

    var method = target.GetType().GetMethod(req.method, BindingFlags.Public | BindingFlags.Instance);
    if (method == null) throw new InvalidOperationException();

    object[] parameters = new object[0];
    if (req.parameters != null)
    {
        parameters = method.GetParameters().Zip(req.parameters, (m, p) => Convert.ChangeType(p, m.ParameterType)).ToArray();
    }

    return method.Invoke(target, parameters);
}
公共类请求
{
公共字符串方法;
公共对象[]参数;
}
公共静态对象Exec(字符串json,对象目标)
{
var req=JsonConvert.DeserializeObject(json);
var method=target.GetType().GetMethod(req.method,BindingFlags.Public | BindingFlags.Instance);
如果(方法==null)抛出新的InvalidOperationException();
object[]参数=新对象[0];
如果(请求参数!=null)
{
parameters=method.GetParameters().Zip(req.parameters,(m,p)=>Convert.ChangeType(p,m.ParameterType)).ToArray();
}
return method.Invoke(目标、参数);
}

您是否在使用JSON.net时遇到了可能重复的问题?您不能使用4.5中WCF中的自动序列化吗?您还没有明确说明为什么需要接受20个不同的“对象”作为单个OperationContract的参数,但我猜您滥用了OperationContract。最好是创建多个OperationContract,每个都接受您期望的参数类型。@celerno我不需要动态对象,我需要一种很好的方法将json反序列化为已知类型之一。@QuéPadre创建一个接受多个类型的OperationContract通常不是一个好主意,尤其是,当某个基不共享该类型时。然而,若您打算这样做……您可以创建一个类型字典,以及它们关联的json反序列化程序。然后,正如您所提到的,在传入的JSON字符串中附加类型作为根级别的属性,从字典中查找适当的反序列化器实例,并使用它生成所需的对象。我需要知道确切的对象类型,并将反序列化的对象传递给某些策略。例如,我可以收到不同的命令“给我一些啤酒”,“开始演奏披头士”等等。。。一个命令可以在json中携带大量参数,另一个命令可以简单到hell@Qu你很容易修理。删除
T
并使该方法返回一个对象。