优化 JSON 序列化器/反序列化器作为扩展方法?
Posted
技术标签:
【中文标题】优化 JSON 序列化器/反序列化器作为扩展方法?【英文标题】:Optimized JSON serialiser / deserialiser as an extension method? 【发布时间】:2011-01-23 00:36:46 【问题描述】:我想尽可能轻松地将任何对象序列化为 JSON,然后简单地将其转换回 type=safe 对象。谁能告诉我我在“FromJSONString”扩展方法中做错了什么?
编辑
为方便起见,下面提供了一个完整的功能扩展方法。如果您发现错误,请告诉我。
public static string ToJSONString(this object obj)
using (var stream = new MemoryStream())
var ser = new DataContractJsonSerializer(obj.GetType());
ser.WriteObject(stream, obj);
return Encoding.UTF8.GetString(stream.ToArray());
public static T FromJSONString<T>(this string obj)
using (var stream = new MemoryStream(Encoding.UTF8.GetBytes(obj)))
DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(T));
T ret = (T)ser.ReadObject(stream);
return ret;
【问题讨论】:
【参考方案1】:您必须将 JSON 字符串提供给要解码的 MemoryStream。具体来说,你必须改变:
MemoryStream stream1 = new MemoryStream();
实际检索字符串字节:
MemoryStream stream1 = new MemoryStream(Encoding.UTF8.GetBytes(obj))
话虽如此,我也会确保进行适当的内存清理并处置我的对象......而且,而不是使用 StreamReader(也应该被处置),只需将内存流重新编码为 UTF- 8 串。清理后的代码见下文。
public static String ToJSONString(this Object obj)
using (var stream = new MemoryStream())
var ser = new DataContractJsonSerializer(obj.GetType());
ser.WriteObject(stream, obj);
return Encoding.UTF8.GetString(stream.ToArray());
public static T FromJSONString<T>(this string obj)
using (var stream = new MemoryStream(Encoding.UTF8.GetBytes(obj)))
DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(T));
T ret = (T)ser.ReadObject(stream);
return ret;
【讨论】:
面团!我实际上在该代码中遇到了一些问题。正在修复它...谢谢,没看到那个。【参考方案2】:这在继承对象的情况下无法正常工作。
反序列化只返回基础对象,不返回序列化对象。如下更改序列化将解决此问题。
public static String ToJSONString(this Object obj)
using (var stream = new MemoryStream())
var ser = new DataContractJsonSerializer(typeof(object));
ser.WriteObject(stream, obj);
return Encoding.UTF8.GetString(stream.ToArray());
【讨论】:
以上是关于优化 JSON 序列化器/反序列化器作为扩展方法?的主要内容,如果未能解决你的问题,请参考以下文章
Spring boot 动态/注解自定义 JSON 反序列化器