我有一个桌面应用程序,它使用JavaScriptSerializer
类来解码MediaWiki Web应用程序返回的一些JSON。这很容易弄清楚,但是有一个特殊的JSON响应包括" *"作为一个字段名称,我不知道如何处理它。
这里有一些示例JSON:
{
"warnings": {
"login": {
"result": "OK",
"*": "blah blah blah"
}
}
}
我已经创建了一个rLogin
类来包含login
子对象的结果,并且在该类中我为{{{{}}创建了一个字符串enter code here
对象1}}但我不知道该为另一个领域做些什么。显然,我无法在班级中创建名称为result
的字段,那么如何获得该值呢?
答案 0 :(得分:2)
您需要创建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; }
}
在我们的输出中,我们现在有了#blah blah blah&#34;在Details
属性中。