2016-02-12 31 views
3

我正在嘗試編寫一個包含newtonsoft JSON.net組件的Web API。沒有服務參考的項目。錯誤:輸入'Newtonsoft.Json.Linq.JToken'是不支持的遞歸收集數據合同。

我的代碼是相當直接:

 public object GetJsonFile(int id = 1) { 
     using (StreamReader r = new StreamReader(myJsonFile)) { 
      string json; 

     // todo: build logic to only grab latest when an id is supplied 
     json = r.ReadToEnd(); 

     object jsonObject = JsonConvert.DeserializeObject(json); 
     return jsonObject; 
     } 

當測試頁面,我得到了可怕的「類型‘Newtonsoft.Json.Linq.JToken’是不支持遞歸收集數據的合同。考慮修改集合'Newtonsoft.Json.Linq.JToken'的定義以刪除對自身的引用。「錯誤。

我已經完成了我的挖掘份額,並且每個人似乎都建議取消選中「在所有引用的程序集中重用類型」,但似乎只用於服務引用的情況下,而我的項目沒有使用。我確實找到了做這件事的地方,但看到我沒有參考服務,我無法配置它。

我不是在家裏在Visual Studio中,所以請去容易在我身上;)

+0

哪一行引發此異常?這一個'JsonConvert.DeserializeObject'?或者,客戶端調用中的錯誤?我認爲Json.NET的DeserializeObject也可以反序列化嵌套對象。只有默認的DataContractSerializer出現了這個問題。 –

+0

嗨@MichaelSync。它甚至沒有輸入代碼(我設置了斷點),所以我沒有行號顯示。它開始編譯,然後拋出異常。 – SchmitzIT

+0

我們必須確保您確實向我們展示了存在問題的代碼。你是從Visual Studio運行你的WCF項目嗎?或者,你是否從VS一起運行客戶端和WCF項目?我建議你從VS運行你的WCF項目,並把該斷點放在函數的第一行,讓我知道它是否輸入代碼。如果它沒有打到代碼的第一行,那麼你得到的異常來自不同的方法。 –

回答

0

我從來沒有設法弄清楚如何迴避這一點。我最終做的是在JSON中創建實體作爲類,並讓JSON.NET將JSON反序列化爲該類。

0

使用Json.Net設置與正確的設置序列:

爲了您web.api控制器InvalidDataContract例外用途:

 public static void Register(HttpConfiguration config) 
     { 
      config.Formatters.JsonFormatter.SerializerSettings = new JsonSerializerSettings() 
      { 
       Formatting = Formatting.Indented, 
       TypeNameHandling = TypeNameHandling.Auto, 
       ContractResolver = new CamelCasePropertyNamesContractResolver(), 
       NullValueHandling = NullValueHandling.Ignore, 
       ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore 

     }; 

你Json.Net默認設置JsonConvert用法:

JsonConvert.DefaultSettings =() => new JsonSerializerSettings() 
       { 
        Formatting = Formatting.Indented, 
        TypeNameHandling = TypeNameHandling.Auto, 
        ContractResolver = new CamelCasePropertyNamesContractResolver(), 
        NullValueHandling = NullValueHandling.Ignore, 
        ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore 

      };