代码之家  ›  专栏  ›  技术社区  ›  EMP

.NET中真正简单的JSON序列化

  •  9
  • EMP  · 技术社区  · 14 年前

    我有一些简单的.NET对象,我想序列化到JSON,然后再返回。要序列化的对象集非常小,我控制了实现,所以我不需要一个通用的解决方案来解决所有问题。由于我的程序集将作为库分发,我真的希望避免依赖某个第三方DLL:我只想给用户一个他们可以引用的程序集。

    我已经阅读了在.NET中转换JSON和从JSON转换的其他问题。当然,json.net的推荐解决方案确实有效,但它需要分配一个额外的dll。

    我不需要json.net的任何花哨特性。我只需要处理一个包含字符串、整数、日期时间和字符串和字节数组的简单对象(甚至字典)。在反序列化时,我很高兴能得到一个字典——它不需要再创建一个对象。

    是否有一些真正简单的代码可以编译到程序集中来完成这个简单的工作?

    我也试过了 System.Web.Script.Serialization.JavaScriptSerializer ,但它的下降点是字节数组:我希望base64对其进行编码,甚至注册一个转换器,由于API的工作方式(它不以字段的名称传递),也不容易做到这一点。

    2 回复  |  直到 13 年前
        1
  •  4
  •   Dean Harding    14 年前

    Json.NET 如果获得了MIT的许可,您可以下载源代码,并且只包含应用程序所需的那些文件。

        2
  •  4
  •   EMP    13 年前

    允许使用.NET框架的可能解决方案 JavaScriptSerializer 是注册一个转换器,Base-64将字节数组编码为子字段,如下所示:

    class ByteArrayBase64Converter : JavaScriptConverter
    {
        public override object Deserialize(IDictionary<string, object> dictionary, Type type, JavaScriptSerializer serializer)
        {
            return Convert.FromBase64String((string)dictionary["b64"]);
        }
    
        public override IDictionary<string, object> Serialize(object obj, JavaScriptSerializer serializer)
        {
            return new Dictionary<string, object> { { "b64", Convert.ToBase64String((byte[])obj) } };
        }
    
        public override IEnumerable<Type> SupportedTypes
        {
            get { return new[] { typeof(byte[])}; }
        }
    }
    
    
    var serializer = new JavaScriptSerializer();
    serializer.RegisterConverters(new JavaScriptConverter[] { new ByteArrayBase64Converter() });