【问题标题】:Custom JsonConverter does not call ReadJson自定义 JsonConverter 不调用 ReadJson
【发布时间】:2015-11-20 15:22:23
【问题描述】:

我正在尝试为结构实现自定义 JsonConverter,但我很难让它工作。我之前为另一个类实现了一个自定义转换器,并且该转换器完美运行,我以为我对这个类做了同样的事情,但我的转换器的 ReadJson 方法从未被调用。

这是课程:

public class TransformMatrixConverter : JsonConverter
{
  public override bool CanConvert(Type objectType)
  {
    return typeof(TransformMatrix).IsAssignableFrom(objectType);
  }

  public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
  {
    throw new NotImplementedException();
  }

  public override bool CanWrite
  {
    get { return false; }
  }

  public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
  {
    throw new NotImplementedException();
  }
}

下面是我如何在我的 Item 类中使用它。你可以看看我的另一个转换器,它工作正常。

public static Item FromJSON(string json)
{
  JsonConverter[] converters = { new LineConverter(), new TransformMatrixConverter() };
  return JsonConvert.DeserializeObject<Item>(json, new JsonSerializerSettings()
  {
    Converters = converters
  });
}

会发生什么:我的转换器的 CanConvert 方法被调用并在适当时正确返回 true;但是,ReadJson 方法永远不会被命中,我在那里有一个断点,并且永远不会抛出异常。我已经验证了转换器的 CanRead 属性是真的。我在这里不知所措,有什么想法吗?

【问题讨论】:

  • 您遗漏了一些关键细节。 JSON 是什么样的,ItemTransformMatrix 的定义是什么样的?根据您提供的信息,我无法重现该问题。具有组成的 JSON 和类/结构定义的基本最小程序在 TransformMatrixConverter 中遇到异常。小提琴:dotnetfiddle.net/IEexiW
  • 您是否验证过 Json.NET 是否确实将typeof(TransformMatrix) 传递给您的CanConvert(type)?或者您是否只是验证 1) 它被调用,以及 2) 当使用 typeof(TransformMatrix) 手动调用时它返回 true
  • @BrianRogers 啊谢谢!您让我检查了有问题的代码的另一部分!我想我现在解决了 - 我认为我正在反序列化的 TransformMatrix 只是一个只读属性。
  • @user1846231 您应该考虑添加您的解决方案作为您问题的答案,以便其他人知道问题已解决。

标签: c# json.net


【解决方案1】:

我想我在 Brian 的帮助下解决了这个问题,这个问题与上面的代码无关——我认为我正在反序列化的 TransformMatrix 只是一个只读属性。我使用的解决方案是公开反序列化器可以写入的另一个属性。

【讨论】:

    猜你喜欢
    • 2014-08-28
    • 2019-08-02
    • 2020-10-05
    • 2022-12-14
    • 2013-07-25
    • 2022-12-14
    • 1970-01-01
    • 1970-01-01
    • 2015-08-26
    相关资源
    最近更新 更多