2

我想分两步反序列化 JSON-RPC 请求:

第 1 步:解析idmethod放入基类
第 2 步:params根据方法解析为第二个类

例子:

interface IAction
{
    bool Exec();
}

class Request
{
    [JsonProperty("method")]
    public string Method;

    [JsonProperty("params")]
    public RawJson Params;

    [JsonProperty("id")]
    public RawJson Id;
}

class Whisper : IAction
{
    [JsonProperty("to")]
    public string To;

    [JsonProperty("msg")]
    public string Message;

    public bool Exec()
    {
        // Perform the whisper action
        return true;
    }
}

class Say : IAction
{
    [JsonProperty("msg")]
    public string Message;

    public bool Exec()
    {
        // Perform the say action
        return true;
    }

}

代码(如果有这样的对象RawJson

Request req = JsonConvert.DeserializeObject<Request>(s);
if( req.Method == "whisper" )
{
    Whisper whisper = RawJson.DeserializeObject<Whisper>();
    whisper.Exec();
}

解决它的一种方法是如果 Json.NET 有某种原始 json 对象,但我找不到。

那么,我只是错过了原始对象还是有另一种好方法呢?


附言。该id值可以是任何值:null、string、int、array 等。它应该只在 json-rpc 响应中返回。

4

1 回答 1

2

您可以使用dynamic

dynamic dynJson = JsonConvert.DeserializeObject(s)
if(dynJson.method=="whisper")
{
    var to = dynJson.@params.to; //since params is reserved word
}

这也是可以的

string json = "{method:'whisper',params:{to:'aaa',msg:'msg1'}}";

var jObj = JsonConvert.DeserializeObject(json) as JObject;
if (jObj["method"].ToString() == "whisper")
{
    var whisper = JsonConvert.DeserializeObject<Whisper>(jObj["params"].ToString());
}
于 2012-12-05T08:03:38.960 回答