2016-05-11 7 views
3

適切なJsonレスポンスの後にいくつかのゴミを返すダンサルによって実装されたいわゆるWebサービスを消費する必要があります。このような 何か: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を使用しています。 、いつものようにJson.Net FTW

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")); 
    } 

:私が知っていた

+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

underlying field is nullable以降、すでにfalseになっています。

+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'がデフォルトでエラーになるという感覚がありましたが、[フラグメントループ](http://www.newtonsoft.com/json/help/html/ReadMultipleContentWithJsonReader .htm)はそうしないでしょう。 – dbc

1

はシンプルかつ堅牢な方法でなければなりませんでした。

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

奇妙なことに、デフォルト値はそうという事実にもかかわらず、明示的にこれを行うことが必要である:あなたはまた、非直列化されたJSONオブジェクトの終了後に任意のコンテンツを無視するシリアライザを伝えるためにJsonSerializerSettings.CheckAdditionalContent = falseを設定することができ

関連する問題