Android Xamarin JSON反序列化失败问题排查与解决
问题背景
你现在的场景是:用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
解决方案(两种可选)
方案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

