0

WebAPIの1つにGENERICプロパティが1つあり、HttpGetを介してWebAPIコントローラメソッドを呼び出すときにオブジェクトを返すモデルクラスがあります。応答JSONをDEシリアライズできます。ローカル変数(レスポンスのHardcoded値)にJSON文字列をコピーしようとすると、そのDEシリアライズはうまくいっていますが、動的に失敗しています。親切モデルクラスWebAPIでJsonConvert.DeserializeObjectの問題が発生しました。応答結果 - C#

ジェネリックモデルクラス:

public class Response<T> { 
    public T Person { get; set; } 
    public string Mobile { get; set; } 
    public string Email { get; set; } 
} 

従業モデルクラス:私はWebAPIのコントローラの方法を考えてみましょタイプResponse<Celebrity>

のJSON文字列を抱えている

public class Employee { 
    public string EmpId { get; set; } 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public string OrganizationName { get; set; } 
} 

public class Celebrity { 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public string Language { get; set; } 
} 

public class PersonController : ApiController { 

    [HttpGet] 
    public Response<Celebrity> GetPerson() { 
     return new Response<Celebrity>() 
     { 
      Person = new Celebrity() 
      { 
       FirstName = "Emma", 
       LastName = "Watson", 
       Language = "English" 
      }, 
      Mobile = "222123456", 
      Email = "[email protected]" 
     }; 
    } 
} 

コンソールアプリケーションで、私はWebAPIコントローラメソッドを呼び出していますが、それはDEシリアル化されていません。 Iは、ステップ#1の打ち値を使用#2:#1 IはapiResponse.Content.ReadAsStringAsync().Result

{"Result":{"FirstName":"Emma","LastName":"Watson","Language":"English"},"Mobile":"222123456","Email":"[email protected]"} 

ステップの値をコピー:

string jsonContent = string.Empty; var apiResponse = ApiClient.GetAsync("GetPerson").Result; if (apiResponse.IsSuccessStatusCode) { jsonContent = apiResponse.Content.ReadAsStringAsync().Result; Response<Celebrity> person = JsonConvert.DeserializeObject<Response<Celebrity>>(jsonContent); } 

Iはステップ

次のアプローチを試みました

string jsonContent = "{\"Result\":{\"FirstName\":\"Emma\",\"LastName\":\"Watson\",\"Language\":\"English\"},\"Mobile\":\"222123456\",\"Email\":\"[email protected]\"}"; 

Response<Celebrity> person = JsonConvert.DeserializeObject<Response<Celebrity>>(jsonContent); 

その働き。私は何を逃したのか分からない。

答えて

0

APIレスポンスのエンコーディングに問題がある可能性があります。これはまた、ハードコーディングされた値がなぜ機能するのかを説明します。したがって

次のコードを試してみて、それが動作するかどうかを確認:

string rawApiResponseString = apiResponse.Content.ReadAsStringAsync().Result; 
string jsonContent = Encoding.UTF8.GetString(Encoding.Default.GetBytes(rawApiResponseString)); 

Response<Celebrity> person = JsonConvert.DeserializeObject<Response<Celebrity>>(jsonContent); 

EDIT:次のコードが動作するかどうか

試してみてください。

string jsonContent = apiResponse.Content.ReadAsStringAsync().Result; 
Celebrity person = JsonConvert.DeserializeObject<Celebrity>(jsonContent); 

JSON stringをシリアル化するようですCelebrityであり、Response<Celebrity>ではありません。

+0

それでも私は同じ問題を取得していますようになるはずです。 –

+0

@Mastero例外が発生するのですか、それともデシリアライズしませんか? –

+0

いいえ例外はありませんモデルのデフォルトインスタンスを取得していますが、何も割り当てられていません。 –

0

解決策が見つからない場合は、こちらをご覧ください。クラスに「DataContractAttribute」属性を追加し、すべてのパブリックメンバーに「DataMemberAttribute」を追加してみてください。

両方の属性が "System.Runtime.Serialization"という名前空間にあります。 "参照の追加"を使用してこの参照を追加し、 "アセンブリ"、 "フレームワーク"を選択できます。

基本的に変更したクラスは、この

レスポンスクラス

[DataContract] 
public class Response<T> { 
    [DataMember] 
    public T Person { get; set; } 
    [DataMember] 
    public string Mobile { get; set; } 
    [DataMember] 
    public string Email { get; set; } 
} 

従業モデルクラス

[DataContract] 
public class Employee { 
    [DataMember] 
    public string EmpId { get; set; } 
    [DataMember] 
    public string FirstName { get; set; } 
    [DataMember] 
    public string LastName { get; set; } 
    [DataMember] 
    public string OrganizationName { get; set; } 
} 
[DataContract] 
public class Celebrity { 
    [DataMember] 
    public string FirstName { get; set; } 
    [DataMember] 
    public string LastName { get; set; } 
    [DataMember] 
    public string Language { get; set; } 
} 
関連する問題