[英]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.