自定义JsonReader抛出当前JsonReader项不是对象:String。在所有对象上

时间:2017-07-08 22:03:01

标签: c# json json.net

我创建了一个自定义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项不是对象:String。

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

1 个答案:

答案 0 :(得分:0)

是的,您的转换器存在问题。您的转换器旨在从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