2016-05-11 44 views
3

我必須使用一個愚蠢的猴子實現的所謂的Web服務,它在正確的Json響應之後返回一些垃圾。 事情是這樣的:使用Json.Net廢棄json對象之後的垃圾字符

{ 
    "Property1": 1, 
    "Property2": 2, 
    "Property3": 3 
}<?xml version='1.0' ?>Maybe some other gibberish nonsense I wish to discard. 

現在,我可以只搜索"<?xml"和分裂,但我想知道如果我可以使用流閱讀器或東西可以讀高達收盤},然後丟棄剩下的。

我正在使用C#和Json.Net。

+0

你能保證子字符串'<?xml'不會成爲json內部的東西的一部分嗎?像'{「Property1」:「<?xml version ='1.0'>」...} <?xml version ='1.0'> ....'? –

+0

http://stackoverflow.com/questions/524548/regular-expression-to-detect-semi-colon-terminated-c-for-while-loops/524624#524624看看所提出的解決方案,它是基於計數打開/右括號 – Gusman

+0

我想要一個可靠的解決方案。鑑於Json.Net有許多先進的讀者,我想知道如果使用其中的一個而不是標準的JsonConvert,我可以得到一個JToken或類似的東西。 –

回答

2

您還可以設置JsonSerializerSettings.CheckAdditionalContent = false告訴串行忽略反序列化JSON對象結束後的任何內容:

var result = JsonConvert.DeserializeObject<Dictionary<string, long>>(json, new JsonSerializerSettings { CheckAdditionalContent = false }) 

奇怪的是,有必要儘管默認值似乎事實明確地做到這一點已經false,因爲underlying field is nullable

+1

[在這裏特別](https://github.com/JamesNK/Newtonsoft.Json/blob/6d7c94e69fa2f52b91fb22972321cb9b51b9abed/Src/Newtonsoft.Json/JsonConvert.cs#L856-L859)是代碼行是要求你的罪魁禍首明確地將該值設置爲false。 –

+0

@ScottChamberlain - 是的,在這裏介紹這個設置如何與['JsonReader.SupportMultipleContent'](http://www.newtonsoft.com/json/help/html/P_Newtonsoft_Json_JsonReader_SupportMultipleContent.htm)交互。我有一種感覺,'CheckAdditionalContent'後來以這樣的方式添加:'JsonConvert'在遇到其他內容時會默認爲錯誤,但[fragment loops](http://www.newtonsoft.com/json/help/html/ReadMultipleContentWithJsonReader .htm)不會。 – dbc

1

我知道必須有一種簡單可靠的方法:

public T ReadTypeAndDiscardTheRest<T>(string json) 
    { 
     using (var sr = new StringReader(json)) 
     using (var jsonReader = new JsonTextReader(sr)) 
     { 
      var token = JToken.Load(jsonReader); 

      return token.ToObject<T>(); 
     } 
    } 

    [Test] 
    public void TestJsonDiscarding() 
    { 
     var json = @"{""Key"":""a"", ""Value"":""n""}<?xml>aaaa"; 
     var kp = ReadTypeAndDiscardTheRest<KeyValuePair<string, string>>(json); 

     Assert.That(kp.Key, Is.EqualTo("a")); 
     Assert.That(kp.Value, Is.EqualTo("n")); 
    } 

與往常一樣,Json.Net FTW。