簡體   English   中英

如何使用名為“ *”的屬性反序列化JSON字符串?

[英]How do I deserialize a JSON string with a property called “*”?

我有一個桌面應用程序,它使用JavaScriptSerializer類來解碼MediaWiki Web應用程序返回的JSON。 這在大多數情況下都很容易找出來,但是有一個特殊的JSON響應,其中包括“ *”作為字段名稱之一,我不知道該怎么做。

這是一些示例JSON:

{
    "warnings": {
        "login": {
            "result": "OK",
            "*": "blah blah blah"
        }
    }
}

我創建了一個rLogin類來包含login子對象的結果,並且在該類中,我創建了一個String enter code here對象作為result但是我不知道該對其他字段做什么。 顯然,我無法在班級中創建一個名稱為*的字段,那么如何獲得該值呢?

您需要創建一個JavaScriptConverter

JavaScriptConverter類使您可以為JavaScriptSerializer類本身不支持的托管類型實現序列化和反序列化過程。

由於嵌套的原因,它不是最簡單的方法,但是我已經敲了一個粗糙的模型,並在Linqpad中成功對其進行了測試。 這里相關的部分是我們對Deserialize()

public class ResultConverter : JavaScriptConverter
{
    private static readonly IEnumerable<Type> supportedTypes = new List<Type> { typeof(Warnings) };

    public override IEnumerable<Type> SupportedTypes => supportedTypes;

    public override object Deserialize(IDictionary<string, object> dictionary, Type type, JavaScriptSerializer serializer)
    {
        var warningsDictionary = dictionary["warnings"] as IDictionary<string, object>;
        var loginDictionary = warningsDictionary["login"] as IDictionary<string, object>;

        var login = new Login
        {
            Result = loginDictionary["result"] as string,
            Details = loginDictionary["*"] as string,
        };

        return new Warnings { Login = login };
    }

    public override IDictionary<string, object> Serialize(object obj, JavaScriptSerializer serializer)
    {
        throw new NotImplementedException();
    }
}

支持類和用法:

void Main()
{
    string json = @"{ ""warnings"": { ""login"": { result: ""OK"", ""*"": ""blah blah blah"" } } }";

    var js = new JavaScriptSerializer();
    js.RegisterConverters(new List<JavaScriptConverter> { new ResultConverter() });
    var result = js.Deserialize<Warnings>(json);
    Console.WriteLine(result);
}

public class Login
{
    public string Result { get; set; }
    public string Details { get; set; }
}

public class Warnings
{
    public Login Login { get; set; }
}

在我們的輸出中, Details屬性中現在有了“ blah blah blah”。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM