【问题标题】:Custom JsonReader throws Current JsonReader item is not an object: String. on all objects自定义 JsonReader 抛出当前 JsonReader 项不是对象:字符串。在所有物体上
【发布时间】:2017-07-08 22:03:00
【问题描述】:

我正在创建一个自定义 JsonConverter 以将属性 "Type" : "A"(或“D”、“E”等)转换为包含 ArticleDisambuigation 等的枚举。这是相关的转换器类中的代码:

public override bool CanConvert(Type objectType) => objectType == typeof(SearchResultType);

public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
    var jsonObject = JObject.Load(reader);
    var typeProperty = jsonObject.Properties().FirstOrDefault(p => p.Name == "Type");
    switch ((string)typeProperty.Value)
    {
        case "A": return SearchResultType.Article;
        default: return SearchResultType.None;
    }
}

我的问题是它总是抛出带有消息的异常:

从 JsonReader 读取 JObject 时出错。当前 JsonReader 项不是对象:字符串。

我理解这意味着它期望像 "Name" : "Hello world!" 这样的东西,但得到了 "Name" : 123。但是,我确定它无法解析的属性是字符串。我的转换器有问题吗?

【问题讨论】:

    标签: c# json json.net


    【解决方案1】:

    是的,您的转换器有问题。您的转换器旨在从 JSON 读取字符串值以将其转换为枚举值。字符串值不是 JSON 中的对象,因此您不能将其加载到 JObject 中。相反,您可以直接从阅读器获取字符串值:

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        var type = (string)reader.Value;
        switch (type)
        {
            case "A": return SearchResultType.Article;
            case "D": return SearchResultType.Disambuigation;
            ...
            default: return SearchResultType.None;
        }
    }
    

    小提琴:https://dotnetfiddle.net/tnyZaT

    【讨论】:

    • 我明白了。所以ReadJson() 会为正在解析的对象中的每个值调用,对吗?
    • 没有。 ReadJson 仅针对与转换器表示它可以处理的类型匹配的值调用。由于反序列化器正在解析 JSON,它看到有一个名为 Type 的属性。您的目标类中有一个匹配的 Type 属性。该属性的类型为SearchResultType。所以 Json.Net 调用CanConvert 来查看你的转换器是否可以处理SearchResultType。如果它返回 true,则调用 ReadJson,读取器位于 JSON 中 Type 属性的值处。在您的情况下,该值是一个字符串,因此这就是您的转换器需要处理的内容。
    • 对。我的错,我忘了指定在CanConvert 返回true 的每个值上被调用。谢谢你的解释!
    猜你喜欢
    • 2017-04-08
    • 1970-01-01
    • 2016-04-13
    • 1970-01-01
    • 2021-10-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多