Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net NET中非常简单的JSON序列化_.net_Json_Serialization - Fatal编程技术网

.net NET中非常简单的JSON序列化

.net NET中非常简单的JSON序列化,.net,json,serialization,.net,Json,Serialization,我有一些简单的.NET对象,我想序列化为JSON并再次序列化。要序列化的对象集非常小,并且我控制实现,因此我不需要一个通用的解决方案来解决所有问题。由于我的程序集将作为库分发,我真的希望避免对某些第三方DLL的依赖:我只想给用户一个他们可以引用的程序集 我已经阅读了关于在.NET中转换JSON和从JSON转换JSON的其他问题。当然,推荐的JSON.NET解决方案确实有效,但它需要分发一个额外的DLL 我不需要JSON.NET的任何奇特功能。我只需要处理一个简单的对象(甚至是字典),它包含字符串

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

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

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

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


我也尝试过
System.Web.Script.Serialization.JavaScriptSerializer
,但它失败的地方是字节数组:我想对它进行base64编码,甚至注册一个转换器也不让我轻松完成,因为API的工作方式(它不以字段的名称传递)。

是MIT授权的,您可以只下载源代码并仅包含应用程序所需的文件。

允许使用.NET framework
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() });
class ByteArrayBase64转换器:JavaScriptConverter
{
公共重写对象反序列化(IDictionary dictionary、类型、JavaScriptSerializer序列化程序)
{
返回Convert.FromBase64String((string)字典[“b64”]);
}
公共重写IDictionary序列化(对象obj、JavaScriptSerializer序列化程序)
{
返回新字典{“b64”,Convert.ToBase64String((字节[])obj)};
}
公共覆盖IEnumerable SupportedTypes
{
获取{returnnew[]{typeof(byte[])};}
}
}
var serializer=新的JavaScriptSerializer();
RegisterConverters(新的JavaScriptConverter[]{new ByteArrayBase64Converter()});

您是否考虑过使用将JSON.NET嵌入到程序集中?没有,但感谢您向我指出这一点。我认为这可能是多余的,但它看起来像一个非常有趣的工具,我会考虑使用它做我正在做的其他事情。1如果JSON数据包含字符串,可能值得使用JSON.NET之类的包来为您处理,而不是自己滚动。例如,如何处理字符串中的空格?还是字符串中的单引号/双引号?换行符?我最终在
System.Web.Script.Serialization.JavaScriptSerializer
中解决了这个问题,但我接受了这一点,因为如果不是这样的话,我可能会这么做。@Evgeny-你能详细说明一下你是如何解决字节数组编码这个问题的吗?我也有同样的问题,如果需要的话,我希望避免使用JSON.net这样的第三方库possible@InSane不幸的是,我不记得在这个阶段,不再有权访问该代码。我可能只是自己在对象中对数组进行了base-64编码,或者最终使用了带有子字段的转换器-请参阅我刚才发布的答案。@Evgeny-感谢发布的新答案!