[英]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 反序列化它?
我查看了JsonSerializationOptions
的Encoder
属性,但是当我使用它时没有任何效果。
我正在尝试将其反序列化为以下类 (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 id
和string 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.