首页 新闻 会员 周边

.NET Core反序列化成指定的泛型

0
[已解决问题] 解决于 2023-07-12 12:03

场景

远程接口有一个相对严谨的格式返回数据:

{
  "success": true,
  "message": "Message",
  "data": {
    "token": "token",
    "flag": 1
  }
}

data字段是多变的,可能是数字,字符串,对象,数组也有可能是null,于是我定义了用于读取接口响应内容反序列化的类型:

public class ResultModel<T>
{
    public bool Success { get; set; }

    public string Message { get; set; }

    public T Data { get; set; }
}

我的做法

对于示例中的接口响应信息我定义了一个类型:

 public class LoginResult
 {
     public string Token { get; set; }

     public int Flag { get; set; }
 }

然后读取stream,反序列化成指定的ResultModel<LoginResult>类型

using var stream = await response.Content.ReadAsStreamAsync();
var resultModel = await System.Text.Json.JsonSerializer.DeserializeAsync<ResultModel<TResult>>(stream);

TResult是调用发送请求方法的时候指定的类型:

await GetAsync<LoginResult>(uri);

问题

上面的代码貌似无法反序列化成我指定的类型,我得到的resultModel始终为null

< >
分享
最佳答案
0

我这边测试是可以的

var json = """
    {
      "success": true,
      "message": "登录成功",
      "data": {
        "token": "token",
        "flag": 1
      }
    }
    """;

var options = new JsonSerializerOptions
{
    PropertyNamingPolicy = JsonNamingPolicy.CamelCase
};

var resultModel = JsonSerializer.Deserialize<ResultModel<LoginResult>>(json, options);

Console.WriteLine(resultModel.Data?.Token);
// output: token
奖励园豆:5
dudu | 高人七级 |园豆:30994 | 2023-07-12 11:59

System.Text.Json 默认支持的 PropertyNamingPolicy 是 Pascal Case

dudu | 园豆:30994 (高人七级) | 2023-07-12 12:01

当我指定了PropertyNamingPolicy = JsonNamingPolicy.CamelCase它符合了我的预期,感谢

三大神捕之四 | 园豆:55 (初学一级) | 2023-07-12 12:03

@dudu: 

我也有一个近似的问题。我的api返回值:

var response = new { Token = "111"};

return Ok(response);

但是接受到的是 {"token":"111"}

 

泰德 | 园豆:6 (初学一级) | 2023-07-13 00:56
其他回答(1)
0

/// <summary>
/// 数据传输对象
/// </summary>
public class TData
{
/// <summary>
/// 操作结果,Tag为1代表成功,(默认值)0代表失败,其他的验证返回结果,可根据需要设置
/// </summary>
public int Tag { get; set; } = 0;

    /// <summary>
    /// 提示信息或异常信息
    /// </summary>
    public string Message { get; set; } = "";

    /// <summary>
    /// 扩展Message
    /// </summary>
    public string Description { get; set; } = "";
}

public class TData<T> : TData
{
    /// <summary>
    /// 列表的记录数
    /// </summary>
    public int Total { get; set; }=0;

    /// <summary>
    /// 数据
    /// </summary>
    public T Data { get; set; }
}
0Behavior | 园豆:197 (初学一级) | 2023-07-12 13:54
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册