繁体   English   中英

无法反序列化 Json 字符串中的非 Ascii

[英]Cannot Deserialize Non-Ascii in Json String

每次我尝试反序列化包含非 ASCII 字符的字符串(使用 .netcore3.1 的 JsonSerializer)时,我都没有得到正确的结果。 例如,当这是字符串时

{
  "id": "0",
  "jsonrpc": "2.0",
  "result": {
    "languages": ["German","English","Spanish","French","Italian","Dutch","Portuguese","Russian","Japanese","Chinese (simplified)","Esperanto","Lojban"],
    "languages_local": ["Deutsch","English","Español","Français","Italiano","Nederlands","Português","русский язык","日本語","简体中文 (中国)","Esperanto","Lojban"]
  }
}

我需要做哪些更改才能使用 JsonDeserializer 反序列化它?

我查看了JsonSerializationOptionsEncoder属性,但是当我使用它时没有任何效果。

我正在尝试将其反序列化为以下类 (LanguagesResponse)

    public class LanguagesResponse : RpcResponse
    {
        public LanguagesResult result { get; set; }
    }

    public class LanguagesResult
    {
        public List<string> languages = new List<string>();
        public List<string> languages_local = new List<string>();
    }

其中 RpcResponse 是string idstring jsonrpc

当我收到响应时,我正在反序列化:

            var responseBody = await response.Content.ReadAsByteArrayAsync().ConfigureAwait(false);
            using Stream ms = new MemoryStream(responseBody);
            var serializationOptions = new JsonSerializerOptions()
            {
                IgnoreNullValues = true,
                Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping,
            };
            LanguagesResponse responseObject = await JsonSerializer.DeserializeAsync<LanguagesResponse>(ms, serializationOptions, token).ConfigureAwait(false);

谢谢

不要将MemoryStream传递给DeserializeAsync (只有当内容是 ASCII 时才有效,因为这是字符串与字节数组相同的唯一编码。)

改为传递一个字符串,您可以通过以下方式获得:

string s = Encoding.UTF8.GetString(ms);

也就是说,假设您的内容是 UTF-8 编码的。 你需要找出来。 如果是另一种编码,请使用它而不是Encoding.UTF8

编辑

您实际上不需要找出什么是编码并对其进行硬编码(例如Encoding.UTF8 )。 您可以改用这一行,它将从响应中获取编码:

string s = response.ContentEncoding.GetString(ms);

但是,编写得不好的 API 可能不会在响应中包含编码,您必须对其进行硬编码才能使其正常工作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM