【问题标题】:Cannot Deserialize Non-Ascii in Json String无法反序列化 Json 字符串中的非 Ascii
【发布时间】:2020-11-09 19:17:49
【问题描述】:

每次我尝试反序列化包含非 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);

谢谢

【问题讨论】:

  • 试试ReadAsStringAsync,它应该使用响应中包含的编码(如果包含)。
  • @ckuri 如果没有指定编码怎么办?
  • 它会回退到UTF-8,这也是JsonSerializer的默认编码。

标签: c# json serialization


【解决方案1】:

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

改为传递一个字符串,您可以使用它:

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

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

编辑

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

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

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

【讨论】:

  • 响应对象上没有 ContentEncoding。
  • 试试ContentType
猜你喜欢
  • 1970-01-01
  • 2021-02-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-22
相关资源
最近更新 更多