如何使用名为" *"?

时间:2016-09-20 17:43:48

标签: c# .net json javascriptserializer

我有一个桌面应用程序,它使用JavaScriptSerializer类来解码MediaWiki Web应用程序返回的一些JSON。这很容易弄清楚,但是有一个特殊的JSON响应包括" *"作为一个字段名称,我不知道如何处理它。

这里有一些示例JSON:

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

我已经创建了一个rLogin类来包含login子对象的结果,并且在该类中我为{{{{}}创建了一个字符串enter code here对象1}}但我不知道该为另一个领域做些什么。显然,我无法在班级中创建名称为result的字段,那么如何获得该值呢?

1 个答案:

答案 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属性中。

相关问题