优化 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 反序列化器

使用 Jackson 自定义反序列化:扩展默认反序列化器

Spring @RestController 自定义 JSON 反序列化器

Symfony 序列化器:将 Json 反序列化为实体

当链接器设置为全部链接时,JSON 反序列化失败

更改 ServiceStack.Text JSON 反序列化器的输出