2017-07-08 62 views
0

我正在創建一個自定義JsonConverter以將屬性"Type" : "A"(或「D」,「E」等)轉換爲包含ArticleDisambuigation等的枚舉。下面是轉換器類中的相關代碼:自定義JsonReader引發當前JsonReader項目不是對象:String。所有對象

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。但是,我知道它無法解析的屬性是字符串。我的轉換器有問題嗎?

回答

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

+0

我明白了。因此,對被解析的對象中的每個值調用ReadJson(),是否正確? –

+1

不支持。只有匹配轉換器可以處理的類型的值纔會調用ReadJson。由於反序列化器正在解析JSON,因此它看到有一個名爲'Type'的屬性。在你的目標類中有一個匹配的'Type'屬性。該屬性具有一種「SearchResultType」類型。所以Json.Net調用'CanConvert'來查看你的轉換器是否可以處理'SearchResultType'。如果它返回true,那麼調用'ReadJson',讀取器位於JSON中'Type'屬性的值處。這個值是你的情況下的一個字符串,所以這是你的轉換器需要處理的。 –

+0

對。我的不好,我忘了指定每個CanConvert返回true的值。感謝您的解釋! –