2013-04-02 10 views
10

私は現在、概念実証に取り組んでおり、JSONを使用してHttpRequestをシリアライズする際の問題に直面していました。JSONを使用してリクエストオブジェクトをシリアライズ

背景私はもともと下図のように、私は簡単にJSON.Encode()メソッドを使用して、それを達成することができるだろうと思った

JSON.Encode(HttpContext.Request) 

しかし、私はすぐに、これは円形のすべての種類の原因となることがわかりましたスローされる参照(は、主に、Requestオブジェクトの実際の構造と複雑さに起因する)。

JSON.Encode(new {HttpContext.Request.Cookies,HttpContext.Request.Headers, ... }); 

だけで正常に動作:実際に私は以前、私は必要なだけの特定の要素をつかむために、次のコードを使用してきたように、循環参照が含まれていないプロパティに遭遇したとき、これらにのみ発生します。

これを処理するには、より良い方法があるかどうか不思議です(またはそれを処理する最良の方法はです)。私が間違っていた可能性のある領域を見つけるために、これまでに取ってきたアプローチのいくつかについて詳しく説明します。前

は リクエスト内の各プロパティを反復処理するためにリフレクションを使用し、JSONストリング 「プロパティ・バイ・プロパティ」を構築しようと

  • 近づきます。 (円形 参照に遭遇すると、この失敗)

  • Dictionaryオブジェクト内の各プロパティを保存しようとし、それが出てオブジェクトを「平ら」であろうと期待して全体辞書(をシリアル化するJSONを使用してそしてそれが簡単JSON.NET libraryを使用して、私は循環参照を避けるために、いくつかの追加設定で合格しようとしたJsonConvert.SerializeObject()メソッド(を通してそれをシリアライズしようとしている

  • をシリアル化するために行うことはなく、持っています運があった)

私の最新のアプローチ(JSON.NETライブラリを使用して)私は、しかし、私がリクエスト内のストリームオブジェクトの「タイムアウト」プロパティを関与エラーが発生しました、作業に近い来るだろうと思いました。

私は、単にストリームオブジェクトと循環参照のシリアル化を避けることに反対していません。私は、これらの事故のいずれかを回避しながら、できるだけ多くのRequestオブジェクトを取得しようとしています。

答えて

3

JSON.Netを使用していない特別な理由は何ですか?これにはPreserveReferencesHandlingという名前の設定があり、追加のプロパティ( "$ id": "##")を持つオブジェクトにタグを付けます。そのオブジェクトがシリアライゼーションに複数回現れた場合は、オブジェクトをもう一度書き込む代わりに、 "$ ref"で置き換えます。 "##"はオブジェクトの既存のjsonを指します。これは、循環参照を回避します。

JSONを$ .ajax呼び出しに戻すことは一度もありませんでしたので、Webサイドでの解析に何が含まれるのか分かりません。

+0

マルコムの提案に感謝します。私はあなたの提案を読んでいくつかの設定を適用してからいくつかの方法を使ってみましたが、まだストリーム(ストリームに関係していますか?)の問題が発生しています。何か案は? –

+0

これは、あなたがJSONできないと思うのです。ストリームプロパティを持つオブジェクトを変換します。 –

+0

私はその方法にも傾き始めています。それは、ストリームをシリアライズするときにタイムアウトを引き起こしたように見え、それは前述の答えを出力します。 Streams/Circular Referencesを無視する方法を見つけなければならないと思います。 –

2

私はJsonConvert.SerializeObjectを私のプロジェクトで使用していますが、正常に動作しています。それはあなたの問題を解決するかもしれないようです。

JsonConvert.SerializeObject(reqObject) 
2

私はちょうど同じことを行うことを試み、私はすべての問題の性質を無視する契約リゾルバとJsonConvertを使用してシリアライズ何かを得るために今管理している - 私は、シリアル化を行うには、この行を使用:

string reqStr = JsonConvert.SerializeObject(context.Request, 
    Formatting.Indented, new JsonSerializerSettings { 
     ReferenceLoopHandling = ReferenceLoopHandling.Ignore, 
     ContractResolver = new IgnoreErrorPropertiesResolver() 
}); 

そして、ここでは私が使用契約リゾルバコードです:

public class IgnoreErrorPropertiesResolver : DefaultContractResolver 
{ 

    protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization) 
    { 
     JsonProperty property = base.CreateProperty(member, memberSerialization); 

     if ({"InputStream", 
      "Filter", 
      "Length", 
      "Position", 
      "ReadTimeout", 
      "WriteTimeout", 
      "LastActivityDate", 
      "LastUpdatedDate", 
      "Session" 
     }.Contains(property.PropertyName)) { 
      property.Ignored = true; 
     } 
     return property; 
    } 
} 

これはNewtonsoft.Json.SerializationとするSystem.Reflection usingsが必要になります。

私はセッションオブジェクトを含めることができないので、それは無視されたプロパティのリストにあります。それを含めることができれば、明らかに削除してください!

関連する問題