【问题标题】:Optimized JSON serialiser / deserialiser as an extension method?优化 JSON 序列化器/反序列化器作为扩展方法?
【发布时间】: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;
        }
    }

【问题讨论】:

    标签: c# json c#-4.0 c#-3.0 extension-methods


    【解决方案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());
                }
            }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-27
      • 2018-07-15
      • 2015-11-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多