我想分两个步骤反序列化一个JSON请求:
步骤1:将id和method解析为基类
步骤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对象,但是我找不到。
那么,我是刚刚错过了原始对象,还是有其他好的方法来做到这一点?
Ps。id值可以是任何东西: null、string、int、array等等。它应该在json响应中返回。
发布于 2012-12-05 08:03:38
您可以使用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());
}https://stackoverflow.com/questions/13718638
复制相似问题