优化的JSON序列化器/反序列化器作为扩展方法?

goo*_*ate 3 c# extension-methods json c#-3.0 c#-4.0

我想尽可能容易地将任何对象序列化为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;
        }
    }
Run Code Online (Sandbox Code Playgroud)

Chr*_*ter 6

您必须将JSON字符串提供给要解码的MemoryStream.具体来说,您必须更改:

   MemoryStream stream1 = new MemoryStream(); 
Run Code Online (Sandbox Code Playgroud)

实际上检索字符串字节:

   MemoryStream stream1 = new MemoryStream(Encoding.UTF8.GetBytes(obj))
Run Code Online (Sandbox Code Playgroud)

话虽这么说,我还要确保做适当的内存清理并处理我的对象...而且,不是使用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;
     }
   }
Run Code Online (Sandbox Code Playgroud)


小智 3

在继承对象的情况下,这不能按预期工作。

反序列化仅返回基础对象,而不返回序列化对象。按如下方式更改序列化将解决此问题。

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());
            }
        }
Run Code Online (Sandbox Code Playgroud)