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

Android Xamarin JSON反序列化失败问题排查与解决

解决JSON反序列化错误:从MySQL到Xamarin的类匹配问题

问题背景

你现在的场景是:用PHP从MySQL的mohamiusermeta表(三列:user_id, meta_key, meta_value)查询数据,整理成JSON后,在Xamarin Android里用List<Galeri>反序列化时抛出错误:

Newtonsoft.Json.JsonSerializationException: Cannot deserialize the current JSON object (e.g. {"name":"value"}) into type 'System.Collections.Generic.List`1[Lifecare.Galeri]' because the type requires a JSON array (e.g. [1,2,3]) to deserialize correctly...

错误原因分析

先看你的PHP输出的JSON结构:它是一个以user_id为键的对象(比如{"107": {"user_id":"107", "Office":"...", ...}, "108": {...}}),但你在Xamarin里尝试把它反序列化成List(数组类型),这就是核心矛盾——Newtonsoft.Json无法把键值对对象直接转成列表集合。

解决方案(两种可选)

方案1:修改PHP代码,输出JSON数组(推荐,更符合列表场景)

你的PHP代码最后生成的$newarray是关联数组(键是user_id),只需要把它转成索引数组,就能输出JSON数组格式,这样Xamarin的List<Galeri>就能正常反序列化了。

修改PHP的最后几行代码:

// 把关联数组转成索引数组,json_encode后会输出数组格式的JSON
$outputArray = array_values($newarray);
echo(json_encode($outputArray, JSON_UNESCAPED_UNICODE));
mysqli_close($con);

修改后输出的JSON会变成[{"user_id":"107", ...}, {"user_id":"108", ...}],和List<Galeri>的结构完全匹配。

方案2:修改Xamarin反序列化代码,适配JSON对象结构

如果不想改动PHP,你可以把反序列化的目标类型改成Dictionary<string, Galeri>,因为JSON本身是键值对结构(键是user_id字符串,值是你的Galeri对象)。

修改报错的代码行:

// 替换原有的List<Galeri>为Dictionary<string, Galeri>
var itemGaleriDict = JsonConvert.DeserializeObject<Dictionary<string, Galeri>>(e.Result);
// 如果后续需要列表格式,可再转换
itemGaleri = itemGaleriDict.Values.ToList();

额外验证点

检查你的Xamarin Galeri类的JsonProperty属性是否和JSON里的键完全一致:

  • 比如[JsonProperty("Office")]对应JSON里的"Office",[JsonProperty("officename")]对应"officename",这部分你已经做对了,不需要调整。

内容的提问来源于stack exchange,提问作者Mr.Balaha

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:24:46