gpt4 book ai didi

c# - 有没有更好的方法来处理 Json.Net 的编码值?

转载 作者:太空宇宙 更新时间:2023-11-03 11:03:28 26 4
gpt4 key购买 nike

我正在使用 Json.Net 序列化/反序列化一个具有 System.Text.Encoding 类型属性的类。尝试一个简单的测试,我的类序列化没有任何问题:

public class TestClass {
public Encoding TheEncoding { get; set; }
}

var testClass = new TestClass { TheEncoding = Encoding.UTF8 };
var json = JsonConvert.SerializeObject( testClass, Formatting.Indented );
var obj = JsonConvert.DeserializeObject<TestClass>( json );

序列化为:

{
"TheEncoding": {
"BodyName": "utf-8",
"EncodingName": "Unicode (UTF-8)",
"HeaderName": "utf-8",
"WebName": "utf-8",
"WindowsCodePage": 1200,
"IsBrowserDisplay": true,
"IsBrowserSave": true,
"IsMailNewsDisplay": true,
"IsMailNewsSave": true,
"IsSingleByte": false,
"EncoderFallback": {
"DefaultString": "?",
"MaxCharCount": 1
},
"DecoderFallback": {
"DefaultString": "?",
"MaxCharCount": 1
},
"IsReadOnly": true,
"CodePage": 65001
}
}

然而,在反序列化时,我得到了一个异常:

Could not create an instance of type System.Text.Encoding. Type is an interface or abstract class and cannot be instantiated. Path 'TheEncoding.BodyName', line 3, position 16.

我能够通过创建一个处理 System.Text.Encoding 类型的自定义转换器来解决这个问题:

public class JsonEncodingConverter : JsonConverter {
public override void WriteJson( JsonWriter writer, object value, JsonSerializer serializer ) {
// Serialize as the BodyName.
serializer.Serialize( writer, ( value as Encoding ).BodyName );
}

public override object ReadJson( JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer ) {
// Already good to go.
return existingValue;
}

public override bool CanConvert( Type objectType ) {
return ( typeof ( Encoding ).IsAssignableFrom( objectType ) );
}
}

var testClass = new TestClass { TheEncoding = Encoding.UTF8 };
var json = JsonConvert.SerializeObject( testClass, Formatting.Indented, new JsonEncodingConverter() );
var obj = JsonConvert.DeserializeObject<TestClass>( json , new JsonEncodingConverter() );

现在使用自定义转换器序列化会产生:

{
"TheEncoding": "utf-8"
}

并且当使用自定义转换器反序列化时,此 JSON 可以成功地返回到原始对象。

我是 Json.Net 的新手,我有一种强烈的感觉,我正在以艰难的方式做这件事!肯定有更好、更少涉及的方法来处理 System.Text.Encoding?

最佳答案

使用 [DataContract][DataMember] 属性明确设置哪些属性将在您的 TestClass 对象上序列化。

  1. TheEncoding 属性中省略 [DataMember] 属性。
  2. 创建一个序列化为“utf-8”的辅助属性(取决于 TheEncoding 的值)。在此属性中包含 [DataMember] 属性。

例如:

[DataContract]
public class TestClass
{
public Encoding TheEncoding { get; set; }

[DataMember]
public string TheEncodingName
{
get
{
if (this.TheEncoding == System.Text.Encoding.UTF8)
return "utf-8";
// TODO: More possibilities
}
set
{
if (value == "utf-8")
this.TheEncoding = System.Text.Encoding.UTF8;
// TODO: More possibilities
}
}
}

序列化时,TheEncoding 将被跳过,TheEncodingName 将被序列化。

关于c# - 有没有更好的方法来处理 Json.Net 的编码值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16866632/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com