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

如何向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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 19:54:03