2015-05-07 52 views
1

我在3.5 CF設置中使用Json.net,並驗證字符串確實是完整的JSON時出現問題。JSON.net CF 3.5,驗證JSON是完整的

我使用:

var o = JObject.Parse(incomingString); 

這將返回null如果JSON是不完整的 - 但並非總是如此。如果JSON是「主要形成」的東西,它將正確解析。這個簡單的例子返回一個對象:

{ "Name":"Bob", "Pets":[ {"Type":"Cat", "Name":"Pudge" 

,但如果我在其他地方打破JSON,預期它返回null。

{ "Name":"Bob", "Pets":[ {"Type":"Cat", "Nam 

由於沒有右括號似乎「假設」的括號,並返回一個適當的JObject,但由於這JSON數據流在我需要驗證之前,我處理它,所有的括號匹配。

在我們有限的沙箱中,我似乎沒有任何驗證方法可用於較新的API。在處理之前驗證我是否擁有整個JSON的任何建議?謝謝。

+0

對於它的價值,我無法在.Net 3.5中使用Json.NET 6.0.8重現這一點。在這兩種情況下,我都會遇到'JsonReaderException'。 – dbc

+0

dbc:不要驚訝我。我已經向在我們獲得的庫中提供Newtonsoft.Json的人報告過。我期望他們需要更新一些東西!我很喜歡另一種方法。 – hvolmer

+0

緊湊框架中是否存在'JavaScriptSerializer'?如果你只是'new JavaScriptSerializer()。反序列化(incomingString)'它會在畸形的JSON上拋出一個異常。另外,你使用的是什麼版本的Json.NET? – dbc

回答

2

好的,它已經在Json.NET 4.0.1Fixed JToken Load and Parse methods not checking for incomplete content中修復,但是你的卡在35r8上,因爲這是支持緊湊框架的最後一個版本。在這種情況下,下面的靜態輔助方法將檢查開始和結束的深度匹配:

public static class Json35Extensions 
{ 
    public static JObject ParseObject(string json) 
    { 
     using (var reader = new JsonTextReader(new StringReader(json))) 
     { 
      var startDepth = reader.Depth; 
      var obj = JObject.Load(reader); 
      if (startDepth != reader.Depth) 
       throw new JsonSerializationException("unclosed json found"); 
      return obj; 
     } 
    } 

    public static JArray ParseArray(string json) 
    { 
     using (var reader = new JsonTextReader(new StringReader(json))) 
     { 
      var startDepth = reader.Depth; 
      var obj = JArray.Load(reader); 
      if (startDepth != reader.Depth) 
       throw new JsonSerializationException("unclosed json found"); 
      return obj; 
     } 
    } 
} 

使用Json.NET 3.5.8,爲您的測試JSON字符串,異常得到投擲,但如果我修復你的JSON手動沒有例外。 (注 - 我測試了ParseObject版本,但我沒有測試過ParseArray版本。)

+0

輝煌。即使在我們的「沙箱」中,JObject版本也能正常工作。我很擔心,因爲這些人已經重新編寫了一堆.IO命名空間,但它拼接在一起。我會給它一個解決方案。 – hvolmer

1

我會非常坦率地立即聲明任何這樣的行爲,正是它是: A 錯誤!

......和一個非常嚴肅的,在那。

不限 JSON-解析器實際上呈現這樣的行爲是 「災難性的破壞。」您應該,恕我直言,立即與該軟件包的供應商打開故障單,併爲其分配最高可能的嚴重性。

+0

我一直在想我自己。如果我給它提供'{「Name」:'它返回一個JObject。這顯然是無效的! – hvolmer

+1

這是一個* bug。*舉報。 –