我正在为我的控制器(ASP.NET Core)编写测试,并且正在接收一些JSON。我现在想将它反序列化为正确的对象,以便我可以对返回的数据做一些断言。反序列化期间没有抛出异常,但我的Data
变量为空。
以下是用于反序列化的代码:
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 :(得分:2)
问题1:要反序列化JSON,您需要一个没有参数的公共构造函数。
问题2:您无法反序列化接口类型(IEnumerable
)。
尝试:
var output = JsonConvert.DeserializeObject(responseString,
typeof(CrudOperationResult<List<ApiResource>>));
答案 1 :(得分:1)
由于[...] JsonConvert.DeserializeObject
认为数据为List<T> Data { get; private set; }
。
答案 2 :(得分: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);
}