2014-02-17 211 views
2

我有一个简单的WCF RESTful服务只有一个操作,其中字符串作为参数void Process(string item)item是一个JSON序列化对象,它可以是任何东西。JSON反序列化。

在这种特殊情况下,可以将约20个不同的类发送到此服务。什么是正确和方便的反序列化这些对象?我如何知道JSON背后的实际情况?我可能包括一些Type领域,做一些喜欢使用Json.NET:

dynamic json = JsonConvert.DeserializeObject(input); 

,检查json.Type然后反序列化输入字符串JsonConvert.DeserializeObject<T>(),但我不知道这是一个好主意。你有什么想法?

+2

的可能重复的[反序列化JSON到C#动态对象?](http://stackoverflow.com/questions/3142495/deserialize-json-into-c-sharp-dynamic -object) – celerno

+1

你用JSON.net卡住了吗?你不能使用4.5中的WCF中的自动序列化吗? – crush

+2

您还没有明确说明为什么您需要接受20个不同的“对象”作为单个OperationContract的参数,但我猜测您正在滥用OperationContract。如果您制作了多个OperationContracts,则每个接受您所期望的参数类型可能是最好的。 – crush

回答

0

虽然我会在注释中提到的使用许多OperationContract方法的WCF,但动态方法也是可以的。不要忘记,许多支票都被省略了,并且有很大的改进空间。只是把它当作POC工作。

假设您有一个服务器对象来执行方法。

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

    public string Hello() 
    { 
     return "HELLO"; 
    } 
} 

,你莫名其妙地收到了这些jsons和动态执行

REQ1:{"method":"Add","parameters":[3,5]}

var res1 = Exec(req1, new ServerClass1()); 

REQ 2:{"method":"Hello","parameters":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); 
} 
+0

好吧,这很酷,但我不能在这里写通用方法。我需要知道确切的对象类型并将反序列化的对象传递给某个策略。例如,我可以收到不同的命令“给我一些啤酒”,“开始播放披头士乐队”等等......一个命令可以在json中携带大量参数,另一个可以简单如地狱 –

+1

@QuéPadre易于修复。删除'T'并使该方法返回一个对象。 –