C#的JSON库


76

Microsoft是否提供任何库以在C#中使用JSON?如果没有,您推荐什么开源库?


1
您是指消费,创造还是两者兼而有之?
Dan Esparza

1
消费和创造。谢谢
weilin8

Answers:


77

5
在System.Web.Script.Serialization.JavaScriptSerializer上使用JSON.NET有什么优势?
weilin8

3
它允许您用作类属性,而不是仅序列化字符串,其中一种...还有更多方法..
balexandre

7
不要使用JavaScriptSerializer,它比我测试过的大多数其他JSON序列化器慢40倍左右。
mythz

1
最新的JSON.NET版本在.NET Framework 3.5中存在一些问题。通过使用安装.NET Framework 3.5 SP1可恢复。但是,如果您无法更改为.NET Framework 3.5 SP1,请不要使用JSON.NET
Rudy

1
我曾尝试过JSON.NET,就我所知,它们在多态性方面存在问题。为了使JSON.NET能够反序列化继承的对象,JSON.NET要求通常有一个名为“ $ type”的属性,其中包含类型名称,但是,我认为它需要FULL类型名称,那不是很好。当您在另一端有JAVA / Android时,会出现问题。
Ted

19

您还应该尝试使用我的ServiceStack JsonSerializer-基于领先的JSON序列化程序的基准,它是目前最快的.NET JSON序列化程序,并支持序列化任何POCO类型,DataContract,列表/字典,接口,继承,后期绑定对象(包括匿名对象)类型等

基本范例

var customer = new Customer { Name="Joe Bloggs", Age=31 };
var json = customer.ToJson();
var fromJson = json.FromJson<Customer>(); 

注意:如果性能对您不重要,请仅使用Microsoft的JavaScriptSerializer,因为我不得不将其排除在基准测试之外,因为它的速度比其他JSON序列化器慢40到100倍


14

.net框架通过JavaScriptSerializer支持JSON。这是一个入门的好例子。

using System.Collections.Generic;
using System.Web.Script.Serialization;

namespace GoogleTranslator.GoogleJSON
{
    public class FooTest
    {
        public void Test()
        {
            const string json = @"{
              ""DisplayFieldName"" : ""ObjectName"", 
              ""FieldAliases"" : {
                ""ObjectName"" : ""ObjectName"", 
                ""ObjectType"" : ""ObjectType""
              }, 
              ""PositionType"" : ""Point"", 
              ""Reference"" : {
                ""Id"" : 1111
              }, 
              ""Objects"" : [
                {
                  ""Attributes"" : {
                    ""ObjectName"" : ""test name"", 
                    ""ObjectType"" : ""test type""
                  }, 
                  ""Position"" : 
                  {
                    ""X"" : 5, 
                    ""Y"" : 7
                  }
                }
              ]
            }";

            var ser = new JavaScriptSerializer();
            ser.Deserialize<Foo>(json);
        }
    }

    public class Foo
    {
        public Foo() { Objects = new List<SubObject>(); }
        public string DisplayFieldName { get; set; }
        public NameTypePair FieldAliases { get; set; }
        public PositionType PositionType { get; set; }
        public Ref Reference { get; set; }
        public List<SubObject> Objects { get; set; }
    }

    public class NameTypePair
    {
        public string ObjectName { get; set; }
        public string ObjectType { get; set; }
    }

    public enum PositionType { None, Point }
    public class Ref
    {
        public int Id { get; set; }
    }

    public class SubObject
    {
        public NameTypePair Attributes { get; set; }
        public Position Position { get; set; }
    }

    public class Position
    {
        public int X { get; set; }
        public int Y { get; set; }
    }
}

1
这是很好的代码,我怎么能从一个类中得到结果呢?例如,ObjectName要输出到带有“测试名称”结果的文本框?我试过了'test = GoogleTranslator.GoogleJSON.NameTypePair.ObjectName'messagebox.show(test)
Ebikeneser 2012年






By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.