カスタムシリアライザの問題を使用してRestSharpシリアル化を拡張します
-
23-12-2019 - |
質問
json.netライブラリを使用してデフォルトのRestSharpシリアライゼーションを改善しようとしています。シリアル化をカスタマイズするには、iSerializerインタフェースを実装する必要があります。
public class LowerCaseSerializer : ISerializer{
public LowerCaseSerializer(){
ContentType = "application/json";
}
public string Serialize(object obj){
var settings = new JsonSerializerSettings{
ContractResolver = new LowerCaseResolver()
};
return JsonConvert.SerializeObject(obj, Formatting.None, settings);
}
string ISerializer.RootElement { get; set; }
string ISerializer.Namespace { get; set; }
string ISerializer.DateFormat { get; set; }
public string ContentType { get; set; }
}
.
あなたが見るように私はContractresolverも拡張しています。これは、下限を行う実際のコードです:
public class LowerCaseResolver : DefaultContractResolver{
protected override string ResolvePropertyName(string propertyName){
return propertyName.ToLower();
}
}
.
すべてがセットアップされたら、RestSharpと共に使用できます:
var request = new RestRequest(url, method);
if (ShouldAddBody(method)){
request.JsonSerializer = new LowerCaseSerializer();
request.AddObject(body);
}
var response = client.Execute<T>(request);
.
プロパティが小文字ではない以外はすべて機能します。デバッグをデバッグすると、シリアライザのコンストラクタに入りますが、メソッドは呼び出されません。逆シリアライズ(クライアントに接続するIdeserializeインタフェース)についてまったく同じことを試みたときは、プロパティごとに下のケーシングの方法が呼び出されました。
試みたもの:
request.RequestFormat = DataFormat.Json; // no change
// this correctly lower cases the properties
var json = new LowerCaseSerializer().Serialize(body);
// wrong request sent to the server, it tells me that some property is missing
request.AddBody(json);
// the exact same thing with this
request.AddParameter("application/json", json, ParameterType.RequestBody);
.
最後の2つで気づいたもの:小文字のプロパティが小さい場合は、RestSharpをシリアライズさせると、リクエストには5つのパラメータがあります(各プロパティごとに1つ)。上位2つのメソッドを介して追加すると、プロパティが1つしかありません。これはJSON全体です。
RestSharpの問題を無効にすることはできません。任意の提案?
更新:
これは奇妙な:
- json.netをインストールしたRestSharpをフォークし、うまく機能します
- RestSharp ForkからのRestRequestクラスをコピーし、私のアプリケーションに貼り付け、それを使用して、うまくいって
- 新しいプロジェクトを開始、パッケージマネージャを介してインストールされたRestSharpとJSON.NETはうまくいきます
その後、私のメインアプリケーションからすべてのパッケージを削除し、再表示されません。ちょっとこれをあきらめる。
アップデート2: FOKEDバージョンからのデバッグに注意してください。リクエストフォーマットはdataFormat.jsonであるか、XMLシリアライザを使用します。しかし、それは問題を解決しません。 NULLへのシリアライザの両方を設定しようとしました。
request.JsonSerializer = null;
request.XmlSerializer = null;
.
新しいプロジェクトでは、これを行いましたが、期待どおりNullReferrenceExceptionが発生します。しかし、古いものには何も起こらない。私は変数の名前を変更しようとし、同じタイプの別の変数を作りましたが、何も修正されません。それは私がRestRequestクラスを持っているプロジェクトでは、どういうわけかバグがあると思われるだけです。
私はソリューションに新しいプロジェクトを追加しました。そしてコードは機能します。だからそれは問題を抱えているただ一つのプロジェクトです。
解決
あなたはそれを新しいプロジェクトで再現することができないので、この特定のプロジェクトでは違うものがあり、それが問題を引き起こしている、あなたが記述している問題を引き起こしている必要があります。
あなたが試すことができることのカップル(特に順序で):
-
両方のプロジェクト(機能していないものと該当するもの)で、同じバージョンのライブラリを使用していることを確認してください。パッケージのバージョンとターゲットプラットフォーム(Net4、Net35 ...)。
-
NUGETがすべてのパッケージを再ダウンロードすることを余儀なくされるように、常時以外のプロジェクトの
packages
フォルダを削除します。 -
Lookup SelectionsノードからRESTSHARPを選択したときに、[Visual Studioプロパティ]ウィンドウへの参照パスを検索します。作業によって参照されているライブラリと非労働プロジェクトによって参照されているライブラリ間のバイナリ比較をしてください。
-
残念ながら symbolsource 、SymbolSource 勤務していないプロジェクトでRestSharpを直接デバッグすることはできません。 リフレクター・Net vspro ライセンスがある場合前に試用を使用していません。
-
あなたの働いていないプロジェクトの部分を作業停止するまで作業するまで働く。
編集:
RestRequest
のソースコード AddObject
設定しているJsonSerializer
を使用していないようです。代わりにAddBody
を使用してみましたか?