如何向JSON传入非英文字符 解决Xamarin Forms应用崩溃问题
问题原因
这个崩溃是字符编码不匹配触发的反序列化异常:你使用的瑞典语特殊字符Å、Ä、Ö不属于ASCII字符集,现有代码读取嵌入JSON资源时没有显式指定UTF-8编码,DataContractJsonSerializer默认编码解析失败进而导致崩溃。
修复步骤
第一步:确认JSON文件存储编码
在Visual Studio中打开drawer.json,依次点击【文件】→【高级保存选项】,编码选择Unicode (UTF-8 带签名) - 代码页65001后保存文件,确保特殊字符在嵌入资源编译阶段不会提前乱码。第二步:修改反序列化代码,显式指定UTF-8编码
修改PopulateData方法如下,增加编码指定逻辑:
using System.Text; using System.IO; private static T PopulateData<T>(string fileName) { var file = "CykelStaden.Data." + fileName; var assembly = typeof(App).GetTypeInfo().Assembly; T data; using (var stream = assembly.GetManifestResourceStream(file)) // 显式以UTF-8编码读取流内容 using (var reader = new StreamReader(stream, Encoding.UTF8)) { string jsonContent = reader.ReadToEnd(); using (var memoryStream = new MemoryStream(Encoding.UTF8.GetBytes(jsonContent))) { var serializer = new DataContractJsonSerializer(typeof(T)); data = (T)serializer.ReadObject(memoryStream); } } return data; }
- 第三步(可选优化):更换兼容性更好的序列化组件
如果修改后仍有问题,建议换成Newtonsoft.Json(Json.NET)处理JSON反序列化,对多语言字符的兼容性更强,Nuget安装Newtonsoft.Json包后修改代码如下:
using System.Text; using System.IO; using Newtonsoft.Json; private static T PopulateData<T>(string fileName) { var file = "CykelStaden.Data." + fileName; var assembly = typeof(App).GetTypeInfo().Assembly; using (var stream = assembly.GetManifestResourceStream(file)) using (var reader = new StreamReader(stream, Encoding.UTF8)) { return JsonConvert.DeserializeObject<T>(reader.ReadToEnd()); } }
内容的提问来源于stack exchange,提问作者Jaser
相关产品推荐
相关产品推荐

