2016-05-11 23 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。