2017-06-07 10 views
1

私は自分のコントローラ(ASP.NETコア)のテストを書いており、JSONを受け取っています。私は今返されたデータに対していくつかのアサーションを行うことができるように、正しいオブジェクトに逆シリアル化したいと思います。逆シリアル化中に例外がスローされることはありませんが、私のData変数はnullです。ここでJSONジェネリック型にデシリアライズ

は、直列化復元に使用するコードです:

var output = JsonConvert.DeserializeObject(responseString, 
       typeof(CrudOperationResult<IEnumerable<ApiResource>>)); 

これはCrudOperationResultクラスです:

public class CrudOperationResult<T> 
{ 
    private CrudOperationResult() 
    { } 

    private CrudOperationResult(CrudResult result, string errorMessage, T data) 
    { 
     Result = result; 
     ErrorMessage = errorMessage; 
     Data = data; 
    } 

    [JsonIgnore] 
    public CrudResult Result { get; private set; } 

    public bool IsError 
    { 
     get 
     { 
      return Result == CrudResult.Error; 
     } 
    } 

    public string ErrorMessage { get; private set; } 

    public T Data { get; private set; } 
} 

そして、ここでJSONデータが返されます。

{ 
    "isError": false, 
    "errorMessage": null, 
    "data": [{ 
     "id": 1, 
     "enabled": true, 
     "name": "apiResource1", 
     "displayName": "My API", 
     "description": null, 
     "secrets": null, 
     "scopes": [{ 
      "id": 1, 
      "name": "apiResource1", 
      "displayName": "My API", 
      "description": null, 
      "required": false, 
      "emphasize": false, 
      "showInDiscoveryDocument": true, 
      "userClaims": null 
     }], 
     "userClaims": [{ 
      "id": 1, 
      "type": "role" 
     }, 
     { 
      "id": 2, 
      "type": "user" 
     }] 
    }] 
} 
+0

これは関連していないかもしれないが、私はすべての単一のコンストラクタはプライベートであるため、あなたがCrudOperationResultを作成することができますどのように見ることができません... – Aboc

答えて

1

[...]のためJsonConvert.DeserializeObjectはデータと考えているList<T> Data { get; private set; }です。

+0

私はhttp://json2csharp.com/を使用してjson文字列からクラスを取得します。 – RoJaIt

1

問題1:JSONを逆シリアル化するには、引数のないパブリックコンストラクタが必要です。

問題2:インターフェイスタイプを逆シリアル化できません(IEnumerable)。

試してみてください。

var output = JsonConvert.DeserializeObject(responseString, 
      typeof(CrudOperationResult<List<ApiResource>>)); 
+0

実際、私はそれらの両方が間違っていることを証明しました。コンストラクタはプライベートにすることができます(逆シリアル化時にリフレクションを使用する必要があり、IEnumerableを使用することができました)。 – blgrnboy

0

が使用この機能:

List<T> ToJson<T>(byte[] byteArray) where T : new() 
{ 

MemoryStream stream = new MemoryStream(byteArray); 


JsonSerializer se = new JsonSerializer(); 

StreamReader re = new StreamReader(stream); 
JsonTextReader reader = new JsonTextReader(re); 
    return se.Deserialize<List<T>>(reader); 
} 
関連する問題