我必须使用一个所谓的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.
您还可以设置JsonSerializerSettings.CheckAdditionalContent = false
来告诉序列化程序忽略反序列化JSON对象结束后的任何内容:
var result = JsonConvert.DeserializeObject<Dictionary<string, long>>(json, new JsonSerializerSettings { CheckAdditionalContent = false })
奇怪的是,尽管默认值似乎已经是false
,但有必要显式地执行此操作,因为底层字段是可以为null的。
我知道必须有一种简单而稳健的方法:
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。