2016-07-26 10 views
1

RestSharpを使用してREST Webサービスを使用しています。 RestSharpの内部に統合された自動シリアライゼーション/デシリアライゼーションで使用するための独自のレスポンスオブジェクトクラスを実装しました。RestSharpがJSONを正しくデシリアライズしない

また、正しく動作する列挙型のマッピングを追加しました。 Response.Contentは、私が何を期待含まれていますが、デシリアライズプロセスが正しく動作しませんので

このクラスの問題は、私が正しい要求を送信するとき、私は戻って正しい応答を得るということです。

Response.Content

{ 
    "resultCode": "SUCCESS", 
    "hub.sessionId": "95864537-4a92-4fb7-8f6e-7880ce655d86" 
} 

ResultCodeプロパティはResultCode.SUCCESS列挙値にマッピングされた正しいですが、HubSessionIdプロパティは常にnullそれが直列化復元されていないようなので、それはそうです。

私が見る唯一の問題は、JSON PropertyNameに '。名前に。問題になることはありますか?これはNewtonsoft.Jsonではない新しいJSONシリアライザに関連していますか?どうすれば解決できますか?

UPDATE

私は、JSONの属性がcompletly無視され、これも[JsonConverter(typeof(StringEnumConverter))]されていることがわかりました。したがって、私は、列挙型マッピングは、属性なしでデフォルトのシリアライザによって自動的に実行されると考えています。 "hub.sessionId"プロパティの問題は依然として残ります。

これは

public class LoginResponse 
{ 
    [JsonProperty(PropertyName = "resultCode")] 
    [JsonConverter(typeof(StringEnumConverter))] 
    public ResultCode ResultCode { get; set; } 

    [JsonProperty(PropertyName = "hub.sessionId")] 
    public string HubSessionId { get; set; } 
} 

public enum ResultCode 
{ 
    SUCCESS, 
    FAILURE 
} 

// Executes the request and deserialize the JSON to the corresponding 
// Response object type. 
private T Execute<T>(RestRequest request) where T : new() 
{ 
    RestClient client = new RestClient(BaseUrl); 

    request.RequestFormat = DataFormat.Json; 

    IRestResponse<T> response = client.Execute<T>(request); 

    if (response.ErrorException != null) 
    { 
     const string message = "Error!"; 
     throw new ApplicationException(message, response.ErrorException); 
    } 

    return response.Data; 
} 

public LoginResponse Login() 
{ 
    RestRequest request = new RestRequest(Method.POST); 
    request.Resource = "login"; 
    request.AddParameter("username", Username, ParameterType.GetOrPost); 
    request.AddParameter("password", Password, ParameterType.GetOrPost); 
    LoginResponse response = Execute<LoginResponse>(request); 
    HubSessionId = response.HubSessionId; // Always null! 
    return response; 
} 
+0

'。' newtonsoft jsonではプロパティ名の問題が一度も発生していません。古いバージョンと最新の両方のバージョンがJSONサンプルとうまく動作するので、これを言うことができます。フィドルを参照してください。 https://dotnetfiddle.net/i0zmc0 v3.5.xを使用しています。 8.xでも試してみることができます。 – niksofteng

+0

私のコードについてもう少し詳しく説明します。 –

+0

'JsonProperty'はJson.NET属性です。シリアライザがJson.NETでない場合、JsonProperty属性は無視されます。 * new *シリアライザの同等の属性は何ですか? –

答えて

2

私のコードでは、ケースNewtonsoftのJSON.NETで、カスタムJSON SerializerDeserializerを使用して解決しました。 Philipp Wagnerさんがこのarticleで説明されている手順に従っています。

Requestのシリアル化が、デフォルトのSerializerを使用していて、列挙型で期待どおりに機能しないことに気付きました。列挙型の文字列値をシリアル化する代わりに、列挙型の値から、その列挙型の値を取り出します。

JSON.NETでは、シリアル化と逆シリアル化プロセスが正しく機能します。

関連する問題