2014-02-17 218 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'並使該方法返回一個對象。 –