Newtonsoft.Json SerializeObject返回空JSON串问题求助(Xamarin.Forms开发)
嘿,我完全懂你这种卡壳的感觉!之前我在Xamarin项目里也碰到过一模一样的情况,明明类和成员都是public,序列化出来却是{},调试器还乱显示,真的头大。咱们一步步来排查:
最常见的原因:缺少无参数公共构造函数
Newtonsoft.Json默认要求被序列化的类必须有一个无参数的public构造函数,否则它没法实例化对象来读取数据。如果你的Customer类只有带参数的构造函数,就会出现空JSON的情况。
解决方法很简单,加个无参构造:
public class Customer { // 必须要有这个!序列化器需要它 public Customer() { } // 你的带参构造可以保留 public Customer(string name, int age) { Name = name; Age = age; } public string Name { get; set; } public int Age { get; set; } }
检查是字段还是属性
如果你在Customer里用的是公共字段(比如public string Name;)而不是自动属性(public string Name { get; set; }),Newtonsoft.Json默认只会序列化属性,不会处理字段。这时候有两种解决方式:
方案1:改成属性(推荐)
直接把字段替换成自动属性,这是.NET的最佳实践,也能从根源避免序列化问题。
方案2:配置序列化器包含字段
如果必须保留字段,可以通过配置让序列化器识别公共字段:
var settings = new JsonSerializerSettings { ContractResolver = new DefaultContractResolver { // 让序列化器识别公共字段 DefaultMembersSearchFlags = System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance } }; string json = JsonConvert.SerializeObject(yourCustomerItem, settings);
检查是否有[JsonIgnore]标记
不小心给属性或者类加了[JsonIgnore]特性?序列化器会直接跳过这些成员,自然得到空JSON。检查你的Customer类,把这个标记去掉就行。
关于调试器显示“非公开”的说明
这个大概率是调试器的“迷惑行为”——自动属性的后台字段(比如<Name>k__BackingField)确实是私有的,但你的属性本身是public的。调试的时候别盯着后台字段看,直接看属性的名称(比如Name)就能看到它的真实值了。
验证方法
先写个简单的测试代码,排除其他干扰:
var testCustomer = new Customer { Name = "Alice", Age = 28 }; string testJson = JsonConvert.SerializeObject(testCustomer); Console.WriteLine(testJson);
如果输出是{"Name":"Alice","Age":28},说明你的类定义没问题,问题出在你要序列化的item变量本身(比如没赋值)。
按照上面的步骤排查,应该能快速解决问题!
内容的提问来源于stack exchange,提问作者Lala

