【问题标题】:How do I deserialize a JSON string with a property called "*"?如何反序列化带有“*”属性的 JSON 字符串?
【发布时间】:2016-09-20 17:43:47
【问题描述】:

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

这是一些 JSON 示例:

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

我创建了一个rLogin 类来包含login 子对象的结果,并且在该类中我为result 创建了一个字符串enter code hereobject,但我不知道该怎么做对于另一个领域。显然我不能在我的类中创建一个名称为* 的字段,那么如何获得值呢?

【问题讨论】:

  • result 键实际上是在真实文件中缺少引号还是只是问题示例中的错字?
  • 哦,这只是一个错字.. 抱歉。实际上根本没有结果字段...我只是将其添加为另一个字段的示例,我为其添加了一个字符串对象。

标签: c# .net json javascriptserializer


【解决方案1】:

您需要创建一个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”。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-23
    • 2018-09-03
    • 1970-01-01
    • 1970-01-01
    • 2020-12-12
    • 2017-12-16
    相关资源
    最近更新 更多