JSON反序列化为泛型类型

时间:2017-06-07 15:13:42

标签: c# json serialization

我正在为我的控制器(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"
        }]
    }]
}

3 个答案:

答案 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);
 }