使用Json.Net在json对象之后丢弃垃圾字符

时间:2016-05-11 20:02:48

标签: c# json.net

我必须使用一个由愚蠢的猴子实现的所谓的Web服务,它在正确的Json响应之后返回一些垃圾。 像这样:

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

现在,我可以搜索"<?xml"并拆分,但我想知道我是否可以使用流阅读器或其他内容来阅读最后结束}和然后丢弃其余的。

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

2 个答案:

答案 0 :(得分:2)

您还可以设置JsonSerializerSettings.CheckAdditionalContent = false以告知序列化程序在反序列化的JSON对象结束后忽略任何内容:

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

奇怪的是,有必要明确地这样做,尽管默认值似乎已经是false,因为underlying field is nullable

答案 1 :(得分: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。