.NET 4是否有内置的JSON序列化器/反序列化器?

72

.NET 4自带序列化/反序列化JSON数据的类吗?

  • 我知道有第三方库,例如JSON.NET,但我正在寻找内置于.NET中的东西。

  • 我在MSDN上找到了数据契约(Data Contracts),但它是为WCF而不是Winforms或WPF而设计的。


4
JSON.Net得到了良好的支持,而且微软似乎打算采用它自己的工具 "我们的Web团队将在Web API中将JSON.NET作为默认的JSON序列化器进行包含发布,这会很不错。", 引用自http://www.hanselman.com/blog/OnTheNightmareThatIsJSONDatesPlusJSONNETAndASPNETWebAPI.aspx - Liam
在使用 .Net 进行 JSon 序列化时,请注意嵌入式库的性能! - Babak
2
@Babak,你说的“小心”是什么意思?请详细说明。 - Eriawan Kusumawardhono
@EriawanKusumawardhono,它的性能不是很好。我正在使用SimpleJSON,它不太容易使用,但它的性能要好得多。 - Babak
值得一提的是:我没有尝试过SimpleJSON,但Newtonsoft的库(= JSON.NET)易于使用,文档相当完备,并且就我所知,在我广泛地用于序列化/反序列化时非常高效! - mike
4个回答

43

2
谢谢,MSDN说DataContractJsonSerializer类在程序集System.Runtime.Serialization(在System.Runtime.Serialization.dll中)。然而,VS2010显示错误,找不到DataContractJsonSerializer。 - Cheung
那是因为,如果我没记错的话,在 .Net V4 之前,它驻留在 System.ServiceModel.Web 中。 - Psytronic
2
找到了~ 这是关于目标框架的问题,请看:https://dev59.com/NXI-5IYBdhLWcg3wf4dD - Cheung
1
唯一的问题是你必须使用属性来装饰你的类。 - DonO

31

JavaScriptSerializer 类(虽然你需要引用 System.Web.Extensions 程序集,但该类在 WinForms/WPF 应用程序中运作良好)。即使 DataContractJsonSerializer 类是为 WCF 设计的,但它在客户端应用程序中也能正常工作。


6
FYI: 可以在这里找到 JsonSerializer 和 JavaScriptSerializer 的比较:[https://dev59.com/1mox5IYBdhLWcg3wSCfk]。 - LosManos
1
此外,对于那些寻找JavaScriptSerializer的人来说,它是嵌套在命名空间System.Web.Script.Serialization.JavaScriptSerializer中的。 - Brain2000

11
使用这个通用类来序列化/反序列化JSON。您可以轻松地序列化像这样的复杂数据结构:
Dictionary<string, Tuple<int, int[], bool, string>>

将其转换为 JSON 字符串,然后保存在应用程序设置中或其他地方。

public class JsonSerializer
{
    public string Serialize<T>(T Obj)
    {
        using (var ms = new MemoryStream())
        {
            DataContractJsonSerializer serialiser = new DataContractJsonSerializer(typeof(T));
            serialiser.WriteObject(ms, Obj);
            byte[] json = ms.ToArray();
            return Encoding.UTF8.GetString(json, 0, json.Length);
        }
    }

    public T Deserialize<T>(string Json)
    {
        using (var ms = new MemoryStream(Encoding.UTF8.GetBytes(Json)))
        {
            DataContractJsonSerializer serialiser = new DataContractJsonSerializer(typeof(T));
            var deserializedObj = (T)serialiser.ReadObject(ms);
            return deserializedObj;
        }
    }
}

如果 WriteObject 抛出一个错误 - 这段代码会存在内存泄漏。最好将 MemoryStream 用 using 语句进行包装,例如 using (var ms = new MemoryStream()) { // 在这里编写代码 } - PandaWood
警告!!请将此行 ser.WriteObject(ms, serializedObj); 替换为 ser.WriteObject(ms, aObject); - Riccardo Bassilichi
反序列化方法中有一个小错误。 请将以下代码替换为: DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(T)); - hmojica

0

.NET4内置了一个JSON类,例如DataContractJsonSerializer,但它非常弱,不支持多维数组。我建议您使用JSON.Net。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接