You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C# Xamarin调用API获取JSON数据时所有对象为空的问题排查

解决API返回200但反序列化后属性为空的问题

以下是逐步排查和解决的方法:

1. 确认API返回的原始JSON结构

直接访问API地址(或用Postman、curl工具),复制返回的完整JSON内容,对比你的Voltage_AMS_AHS类结构:

  • 检查JSON是单个对象还是数组,如果是数组,你需要反序列化为List<Voltage_AMS_AHS>或数组类型,而非单个对象。
  • 检查字段的层级,比如是否存在外层包装(如{"result": {...}}),若有则需要创建对应的包装类。

2. 严格校验属性映射

确保特性中的字段名与JSON返回的字段完全一致(包括大小写、下划线、特殊字符):

  • Newtonsoft.Json 使用 [JsonProperty("json字段名")]
  • System.Text.Json 使用 [JsonPropertyName("json字段名")]
    例如JSON返回"ams_voltage": 220,你的属性需标注:
// Newtonsoft.Json
[JsonProperty("ams_voltage")]
public decimal AmsVoltage { get; set; }

// System.Text.Json
[JsonPropertyName("ams_voltage")]
public decimal AmsVoltage { get; set; }

3. 检查类和属性的访问修饰符

确保Voltage_AMS_AHS类及其所有需要赋值的属性都是public修饰的——反序列化库无法访问非public的成员,会导致赋值失败。

4. 修正反序列化代码逻辑

  • 若返回的是数组,调整反序列化目标类型:
    // Newtonsoft.Json
    var dataList = JsonConvert.DeserializeObject<List<Voltage_AMS_AHS>>(jsonContent);
    
    // System.Text.Json
    var dataList = JsonSerializer.Deserialize<List<Voltage_AMS_AHS>>(jsonContent);
    
  • 若存在外层包装,创建包装类并反序列化:
    public class VoltageResponse
    {
        [JsonProperty("data")] // 对应JSON外层字段名
        public Voltage_AMS_AHS Data { get; set; }
    }
    
    // 反序列化
    var response = JsonConvert.DeserializeObject<VoltageResponse>(jsonContent);
    var targetData = response.Data;
    

5. 捕获反序列化错误信息

通过错误日志定位具体问题:

Newtonsoft.Json 错误捕获

var settings = new JsonSerializerSettings
{
    Error = (sender, args) =>
    {
        Console.WriteLine($"反序列化错误:{args.ErrorContext.Error.Message}");
        args.ErrorContext.Handled = true;
    }
};
var result = JsonConvert.DeserializeObject<Voltage_AMS_AHS>(jsonContent, settings);

System.Text.Json 错误捕获

try
{
    var options = new JsonSerializerOptions();
    var result = JsonSerializer.Deserialize<Voltage_AMS_AHS>(jsonContent, options);
}
catch (JsonException ex)
{
    Console.WriteLine($"反序列化错误:{ex.Message}");
}

6. 检查大小写匹配策略

如果API返回驼峰命名字段,且你未手动指定特性,可开启自动大小写映射:

Newtonsoft.Json

var settings = new JsonSerializerSettings
{
    ContractResolver = new CamelCasePropertyNamesContractResolver()
};
var result = JsonConvert.DeserializeObject<Voltage_AMS_AHS>(jsonContent, settings);

System.Text.Json

var options = new JsonSerializerOptions
{
    PropertyNameCaseInsensitive = true
};
var result = JsonSerializer.Deserialize<Voltage_AMS_AHS>(jsonContent, options);

内容的提问来源于stack exchange,提问作者Ben Johnson

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 18:15:18