远程接口有一个相对严谨的格式返回数据:
{
"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
我这边测试是可以的
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
System.Text.Json 默认支持的 PropertyNamingPolicy 是 Pascal Case
当我指定了PropertyNamingPolicy = JsonNamingPolicy.CamelCase它符合了我的预期,感谢
@dudu:
我也有一个近似的问题。我的api返回值:
var response = new { Token = "111"};
return Ok(response);
但是接受到的是 {"token":"111"}
/// <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; }
}