【问题标题】:Deserialize into an object that extends List<T>反序列化为扩展 List<T> 的对象
【发布时间】:2017-12-07 12:37:05
【问题描述】:

使用

var serializer = new System.Web.Script.Serialization.JavaScriptSerializer();

以下正确反序列化我的 JSON 数组:

public List<PrintJobTranslation> Translations

以下不是:

public PrintJobTranslations Translations

public class PrintJobTranslations : List<PrintJobTranslation>
{
    public string GetTranslation(string Key, string defaultValue)
    {
        var translation = this.FirstOrDefault(x => x.Key == Key);
        if (translation == null) return defaultValue;
        return translation.Translation;
    }
}

它会抛出错误:

System.Collections.Generic.Dictionary`2[System.String,System.Object] ist kein Wert des Typs Print.printJob.PrintJobTranslation und kann in diesergenerischen Sammlung nicht verwendet werden。参数名称:值

我没有找到准确的翻译,但应该是这样的英文:

System.Collections.Generic.Dictionary`2[System.String,System.Object] 不是 Print.printJob.PrintJobTranslation 类型的值,不能在通用集合中使用。参数名称:值

如何让 JSON 正确反序列化?

【问题讨论】:

  • 我会尝试用NewtonSoft.Json 来做。甚至微软也不推荐使用JavascriptSerializer
  • 不要使用已弃用的 JavaScriptSerializer。甚至 ASP.NET Web API 也使用 Json.NET。您发布的代码无论如何都不会反序列化任何内容。当您显示 List 时,错误本身是指 dictionary。输入、反序列化代码和 full 异常(包括其调用堆栈)在哪里?您可以通过Exception.ToString() 轻松获取。
  • @CamiloTerevinto 我可能不会向此 DLL 添加外部依赖项。 NewtonSoft.Json 是否适用于所有 .NET 安装,以及如何确保使用正确的版本?我们始终在我们使用它的产品中提供正确的版本。
  • 如果您发布了完整示例(实际 json、PrintJobTranslation 定义、反序列化方式) - 会更容易回答。
  • 看起来这可能是JavaScriptSerializer 中的错误或限制,请参阅c# Deserialize JSON list of object error,它在 2011 年报告了类似问题;公认的答案是只使用List&lt;T&gt; 进行反序列化。

标签: c# json serialization


【解决方案1】:

完全避开这一点的一种方法是不要这样做 - 你的方法看起来像一个“扩展方法”,所以它会一个实例一样工作方法,但实际上不必继承任何东西:

public static class PrintJobTranslationExtensions
{
    public static string GetTranslation(
        this List<PrintJobTranslation> list, string Key, string defaultValue)
    {
        var translation = list.FirstOrDefault(x => x.Key == Key);
        if (translation == null) return defaultValue;
        return translation.Translation;
    }
}

只需在您的代码中使用List&lt;PrintJobTranslation&gt;

【讨论】:

  • List&lt;&gt;继承不是也不鼓励吗?
  • @ViRuSTriNiTy 是的 :) 这就是为什么我不建议这样做 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-28
  • 1970-01-01
  • 1970-01-01
  • 2023-03-30
相关资源
最近更新 更多