Android向C# WebAPI提交JSON时数据/属性为空问题求助
嘿,这个问题我碰到过好多次了!你说加了flush()后对象不再为空但属性全是null,核心问题基本都出在JSON序列化/反序列化的匹配度或者请求配置遗漏上,咱们一个个排查:
1. 先核对两端的字段名称与序列化规则
C#的JSON序列化器(不管是System.Text.Json还是Newtonsoft.Json)默认是区分大小写的,而Android这边常用的Gson/Jackson默认会把Java字段序列化成小驼峰格式(比如userName),如果你的C# User类用的是大驼峰(比如UserName),两边就对不上,自然填充不了值。
解决办法二选一:
- 统一两端的字段命名,比如都用小驼峰或者都用大驼峰;
- 给C#的属性加映射特性:
- 用System.Text.Json的话,加
[JsonPropertyName("userName")]; - 用Newtonsoft.Json的话,加
[JsonProperty("userName")]。
- 用System.Text.Json的话,加
另外还要检查Java的User类:字段有没有public的getter方法?很多Android序列化库是通过getter来读取字段值的,如果没写getter,序列化出来的JSON里根本不会包含这个字段,C#端当然拿不到值。
2. 确认Android端的请求头是否正确设置
这是最容易忽略的点!你必须给请求加上Content-Type: application/json这个头,否则C# WebAPI根本不知道你发的是JSON格式的请求体,只会创建一个空的User对象,不会填充任何属性。
Android端的代码里要加上这一行:
connection.setRequestProperty("Content-Type", "application/json");
记得要放在写入请求体之前哦。
3. 检查Android端的JSON序列化结果
你用OutputStreamWriter写数据的时候,先把序列化后的JSON字符串打个日志看看,比如用Gson的话:
User user = new User(); // 给user赋值 String json = new Gson().toJson(user); Log.d("DebugJSON", json); // 看看这个JSON里有没有你要传的字段和值
如果日志里的JSON是空的或者缺少字段,那问题就出在Android的序列化环节,比如字段没赋值、没加getter,或者序列化库配置有问题。
4. 配置C# WebAPI的反序列化规则
如果不想一个个加映射特性,可以直接让C#的序列化器忽略大小写,或者自动匹配小驼峰:
- 用System.Text.Json的话,在Program.cs里加:
builder.Services.AddControllers() .AddJsonOptions(options => { // 忽略大小写匹配字段 options.JsonSerializerOptions.PropertyNameCaseInsensitive = true; }); - 用Newtonsoft.Json的话,配置成自动用小驼峰解析:
builder.Services.AddControllers() .AddNewtonsoftJson(options => { options.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver(); });
5. 确认WebAPI接口的参数标注
最后检查你的C#接口方法,参数上一定要加[FromBody]特性,告诉WebAPI从请求体里读取JSON数据:
[HttpPost("add-user")] public IActionResult AddUser([FromBody] User user) { // 处理逻辑 }
如果没加这个特性,WebAPI会默认从URL参数或者表单里找值,自然拿不到请求体里的JSON字段。
按这几个步骤排查下来,应该就能解决属性为null的问题啦!
内容的提问来源于stack exchange,提问作者android_monstertjie

