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
相关产品推荐
相关产品推荐

