Json.NET 中的 RawJSON 对象

Posted

技术标签:

【中文标题】Json.NET 中的 RawJSON 对象【英文标题】:RawJSON object in Json.NET 【发布时间】:2012-12-05 07:57:50 【问题描述】:

我想分两步反序列化 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 响应中返回。

【问题讨论】:

【参考方案1】:

您可以使用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());

【讨论】:

我更喜欢使用类,因为它会阐明方法参数的结构,此外我将能够拥有类的方法。 (我将更新我的示例)。 +1,因为它不是一个有效的解决方案。 整洁!这似乎更像我正在寻找的东西。我将在我的代码中尝试一下。 它按预期工作。我想这需要我反序列化-序列化-反序列化导致开销的参数。但如果没有其他解决方案呢?优化将在稍后进行。感谢您的帮助! @ANisus 其实就是deserialize-deserialize 那么ToString()(存储的字符串值)不需要序列化?如果是这样,那就太好了。无论如何,这个解决方案都需要两个反序列化。

以上是关于Json.NET 中的 RawJSON 对象的主要内容,如果未能解决你的问题,请参考以下文章

如何在JSON.NET中读取json对象值中的long值数组

Json.NET 中的异常:处于“开​​始”状态的令牌 PropertyName 将导致无效的 JavaScript 对象

Postman 中的 JSON 帖子有效负载无效

c# 通过json.net中的JsonConverter进行自定义序列化与反序列化

使用 Json.net 将 JSON 对象反序列化为动态对象

使用 JSON.net 将 JSON 解析为匿名对象 []