将值“utf-8”转换为类型“System.Text.Encoding”时出错
Posted
技术标签:
【中文标题】将值“utf-8”转换为类型“System.Text.Encoding”时出错【英文标题】:Error converting value "utf-8" to type 'System.Text.Encoding' 【发布时间】:2020-11-25 07:41:06 【问题描述】:我想反序列化 Json 文件。 Json 值包含一个 Encoding 类值。反序列化 json 值时会导致以下错误。
Json 格式
"HostConnection":
"Address": "testAddress",
"MessageEncoding": "utf-8",
在上面的Json中,
HostConnection 是一个类名 地址是字符串数据类型 MessageEncoding 是一种 Encoding 数据类型序列化,
var deserializedData= JsonConvert.DeserializeObject<HostConnection>(jsonVal);
谁能告诉我为什么会这样。
【问题讨论】:
所以你想把字符串“utf-8”变成System.Encoding
UTF-8的实例?
@CodeCaster 有可能吗?
是的,但你必须想知道你是否想要那个。为什么要序列化编码?您可以使用中间对象进行(反)序列化,或使用非序列化属性在字符串和编码之间进行映射:public Encoding Encoding get return Encoding.GetEncoding(_encodingName);
@CodeCaster 实际上我不能像您所说的那样更改数据类型,因为它是由客户提供的。所以现在我调用了一个转换器方法来覆盖 Read json 反序列化方法,因为 Encoding 类是一个抽象类。但是我仍然没有得到正确的输出
这是否可以序列化 WCF 中的编码类。
【参考方案1】:
这是因为如果Encoding的值设置为UTF-8,在转成json的时候,不是"MessageEncoding": "utf-8",而是如下结构:
"Address":"String content",
"MessageEncoding":
"dataItem":
"m_bodyName":"String content",
"m_dataIndex":2147483647,
"m_flags":4294967295,
"m_headerName":"String content",
"m_uiFamilyCodePage":2147483647,
"m_webName":"String content"
,
"decoderFallback":
"bIsMicrosoftBestFitFallback":true
,
"encoderFallback":
"bIsMicrosoftBestFitFallback":true
,
"m_codePage":2147483647,
"m_isReadOnly":true
这是我的演示:
HostConnection hostConnection = new HostConnection();
hostConnection.Address = "Test";
hostConnection.MessageEncoding = Encoding.UTF8;
string json=JsonConvert.SerializeObject(hostConnection);
Console.WriteLine(json);
如果问题仍然存在,请随时告诉我。
【讨论】:
我想通过 Json 发送编码类型而不是代码。 并非所有类型都可以反序列化。不要尝试序列化/反序列化编码。可以参考这个链接:github.com/JamesNK/Newtonsoft.Json/issues/2238以上是关于将值“utf-8”转换为类型“System.Text.Encoding”时出错的主要内容,如果未能解决你的问题,请参考以下文章
Expression.Error:我们无法将值 3 转换为函数类型
Newtonsoft JSON反序列化问题[将值转换为类型时出错]