如何在.NET中将C#对象转换为JSON字符串?


943

我有这样的课程:

class MyDate
{
    int year, month, day;
}

class Lad
{
    string firstName;
    string lastName;
    MyDate dateOfBirth;
}

我想将一个Lad对象变成这样的JSON字符串:

{
    "firstName":"Markoff",
    "lastName":"Chaney",
    "dateOfBirth":
    {
        "year":"1901",
        "month":"4",
        "day":"30"
    }
}

(不带格式)。我找到了此链接,但是它使用了.NET 4中没有的命名空间。我也听说过JSON.NET,但目前他们的网站似乎已经关闭,而且我不热衷于使用外部DLL文件。

除了手动创建JSON字符串编写器外,还有其他选择吗?


2
JSON.net可以在这里加载另一个更快的解决方案(如他们所说-我自己没有测试过)是ServiceStack.Text,我不建议您滚动自己的JSON解析器。这可能会更慢,更容易出错,或者您必须花费大量时间。
Zebi

是。C#具有一种称为JavaScriptSerializer的类型
Glenn Ferrie


2
嗯..据我所知,您应该可以使用:msdn.microsoft.com/en-us/library/…根据MSDN页面,该文件也位于.Net 4.0中。您应该能够使用Serialize(Object obj)方法:msdn.microsoft.com/en-us/library/bb292287.aspx我在这里缺少什么吗?顺便说一句。您的链接似乎是一些代码,而不是链接
Holger

更不用说它对System.Web.Xyz命名空间没有依赖性...
Dave Jellison

Answers:


897

您可以使用JavaScriptSerializer该类(添加对的引用System.Web.Extensions):

using System.Web.Script.Serialization;
var json = new JavaScriptSerializer().Serialize(obj);

一个完整的例子:

using System;
using System.Web.Script.Serialization;

public class MyDate
{
    public int year;
    public int month;
    public int day;
}

public class Lad
{
    public string firstName;
    public string lastName;
    public MyDate dateOfBirth;
}

class Program
{
    static void Main()
    {
        var obj = new Lad
        {
            firstName = "Markoff",
            lastName = "Chaney",
            dateOfBirth = new MyDate
            {
                year = 1901,
                month = 4,
                day = 30
            }
        };
        var json = new JavaScriptSerializer().Serialize(obj);
        Console.WriteLine(json);
    }
}

95
请记住,Microsoft建议使用JSON.net代替此解决方案。我认为这个答案变得不合适。看看willsteel的答案。来源:https : //msdn.microsoft.com/en-us/library/system.web.script.serialization.javascriptserializer.aspx
rzelek '16

9
@DarinDimitrov,您应该考虑添加有关JSON.net的提示。Microsoft通过JavascriptSerializer推荐它:msdn.microsoft.com/en-us/library/…您还可以在msdn.microsoft.com/en-us/library/…中添加提示,这是框架包含的方法
Mafii

是将您转换为格式的在线工具,希望对您classes有所json帮助。
shaijut

6
Microsoft为什么会推荐一个第三方解决方案?他们的措辞也很奇怪:“应该使用Json.NET进行序列化和反序列化。为启用AJAX的应用程序提供序列化和反序列化功能。”
保护者一

1
请注意System.Web.Extensions,您必须在系统上安装ASP.NET AJAX 1.0ASP.NET 3.5安装它。请参阅本stackoverflow.com/questions/7723489/...
SISIR

1053

因为我们都喜欢单线

...这取决于Newtonsoft NuGet软件包,该软件包很受欢迎,并且比默认的序列化程序更好。

Newtonsoft.Json.JsonConvert.SerializeObject(new {foo = "bar"})

文档:序列化和反序列化JSON


134
Newtonsoft序列化器比内置速度更快,而且可以自定义。强烈建议使用它。感谢您的答复@willsteel
Andrei

8
@JosefPfleger定价为JSON.NET Schema,而不是JSON.NET常规序列化程序,即MIT
David Cumps,2015年

1
我的测试表明,Newtonsoft比JavaScriptSerializer类要慢。(.NET 4.5.2)
nemke

31
如果您阅读了JavaScriptSerializer的MSDN文档,则完全可以使用JSON.net。
dsghi,2015年

3
@JosefPfleger Newtionsoft JSON.net已获得MIT许可...您可以进行修改,然后将其转售给您。他们的定价页面涉及商业技术支持以及他们拥有的一些模式验证器。
cb88

95

使用Json.Net库,您可以从Nuget Packet Manager下载它。

序列化为Json String:

 var obj = new Lad
        {
            firstName = "Markoff",
            lastName = "Chaney",
            dateOfBirth = new MyDate
            {
                year = 1901,
                month = 4,
                day = 30
            }
        };

var jsonString = Newtonsoft.Json.JsonConvert.SerializeObject(obj);

反序列化到对象:

var obj = Newtonsoft.Json.JsonConvert.DeserializeObject<Lad>(jsonString );

57

使用DataContractJsonSerializer类:MSDN1MSDN2

我的例子:这里

与相比,它还可以安全地从JSON字符串反序列化对象JavaScriptSerializer。但是我个人还是更喜欢Json.NET


1
该页面上仍然没有看到任何示例,但是在MSDN其他地方有一些示例->最后一个示例使用扩展方法来实现单行。
Cristian Diaconescu 2015年

哦,我错过了第二条MSDN链接:)
Cristian Diaconescu

2
它不会序列化普通类。错误报告为“考虑使用DataContractAttribute属性对其进行标记,并使用DataMemberAttribute属性对要序列化的所有成员进行标记。如果类型为集合,请考虑使用CollectionDataContractAttribute对其进行标记。”
Michael Freidgeim

@MichaelFreidgeim是的,您必须在要使用属性序列化的类中标记属性。DataContractAttribute DataMemberAttribute
Edgar

1
@MichaelFreidgeim哪个更好取决于要求。使用属性可以配置属性的序列化方式。
埃德加

24

您可以使用Newtonsoft.json来实现。从NuGet安装Newtonsoft.json。然后:

using Newtonsoft.Json;

var jsonString = JsonConvert.SerializeObject(obj);

22

oo!使用JSON框架真的更好:)

这是我使用Json.NET(http://james.newtonking.com/json)的示例:

using System;
using System.Collections.Generic;
using System.Text;
using Newtonsoft.Json;
using System.IO;

namespace com.blogspot.jeanjmichel.jsontest.model
{
    public class Contact
    {
        private Int64 id;
        private String name;
        List<Address> addresses;

        public Int64 Id
        {
            set { this.id = value; }
            get { return this.id; }
        }

        public String Name
        {
            set { this.name = value; }
            get { return this.name; }
        }

        public List<Address> Addresses
        {
            set { this.addresses = value; }
            get { return this.addresses; }
        }

        public String ToJSONRepresentation()
        {
            StringBuilder sb = new StringBuilder();
            JsonWriter jw = new JsonTextWriter(new StringWriter(sb));

            jw.Formatting = Formatting.Indented;
            jw.WriteStartObject();
            jw.WritePropertyName("id");
            jw.WriteValue(this.Id);
            jw.WritePropertyName("name");
            jw.WriteValue(this.Name);

            jw.WritePropertyName("addresses");
            jw.WriteStartArray();

            int i;
            i = 0;

            for (i = 0; i < addresses.Count; i++)
            {
                jw.WriteStartObject();
                jw.WritePropertyName("id");
                jw.WriteValue(addresses[i].Id);
                jw.WritePropertyName("streetAddress");
                jw.WriteValue(addresses[i].StreetAddress);
                jw.WritePropertyName("complement");
                jw.WriteValue(addresses[i].Complement);
                jw.WritePropertyName("city");
                jw.WriteValue(addresses[i].City);
                jw.WritePropertyName("province");
                jw.WriteValue(addresses[i].Province);
                jw.WritePropertyName("country");
                jw.WriteValue(addresses[i].Country);
                jw.WritePropertyName("postalCode");
                jw.WriteValue(addresses[i].PostalCode);
                jw.WriteEndObject();
            }

            jw.WriteEndArray();

            jw.WriteEndObject();

            return sb.ToString();
        }

        public Contact()
        {
        }

        public Contact(Int64 id, String personName, List<Address> addresses)
        {
            this.id = id;
            this.name = personName;
            this.addresses = addresses;
        }

        public Contact(String JSONRepresentation)
        {
            //To do
        }
    }
}

考试:

using System;
using System.Collections.Generic;
using com.blogspot.jeanjmichel.jsontest.model;

namespace com.blogspot.jeanjmichel.jsontest.main
{
    public class Program
    {
        static void Main(string[] args)
        {
            List<Address> addresses = new List<Address>();
            addresses.Add(new Address(1, "Rua Dr. Fernandes Coelho, 85", "15º andar", "São Paulo", "São Paulo", "Brazil", "05423040"));
            addresses.Add(new Address(2, "Avenida Senador Teotônio Vilela, 241", null, "São Paulo", "São Paulo", "Brazil", null));

            Contact contact = new Contact(1, "Ayrton Senna", addresses);

            Console.WriteLine(contact.ToJSONRepresentation());
            Console.ReadKey();
        }
    }
}

结果:

{
  "id": 1,
  "name": "Ayrton Senna",
  "addresses": [
    {
      "id": 1,
      "streetAddress": "Rua Dr. Fernandes Coelho, 85",
      "complement": "15º andar",
      "city": "São Paulo",
      "province": "São Paulo",
      "country": "Brazil",
      "postalCode": "05423040"
    },
    {
      "id": 2,
      "streetAddress": "Avenida Senador Teotônio Vilela, 241",
      "complement": null,
      "city": "São Paulo",
      "province": "São Paulo",
      "country": "Brazil",
      "postalCode": null
    }
  ]
}

现在,我将实现构造函数方法,该方法将接收JSON字符串并填充类的字段。


1
好的帖子,这是最新的方法。
MatthewD '16

20

System.Text.Json名称空间中提供了一个新的JSON序列化器。它包含在.NET Core 3.0共享框架中,并且位于NuGet软件包中,用于针对.NET Standard或.NET Framework或.NET Core 2.x的项目。

示例代码:

using System;
using System.Text.Json;

public class MyDate
{
    public int year { get; set; }
    public int month { get; set; }
    public int day { get; set; }
}

public class Lad
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public MyDate DateOfBirth { get; set; }
}

class Program
{
    static void Main()
    {
        var lad = new Lad
        {
            FirstName = "Markoff",
            LastName = "Chaney",
            DateOfBirth = new MyDate
            {
                year = 1901,
                month = 4,
                day = 30
            }
        };
        var json = JsonSerializer.Serialize(lad);
        Console.WriteLine(json);
    }
}

在此示例中,要序列化的类具有属性而不是字段。在System.Text.Json串行目前不序列字段。

说明文件:


9

如果它们不是很大,那么您的情况可能是将其导出为JSON。

同样,这使得它可以在所有平台之间移植。

using Newtonsoft.Json;

[TestMethod]
public void ExportJson()
{
    double[,] b = new double[,]
        {
            { 110,  120,  130,  140, 150 },
            {1110, 1120, 1130, 1140, 1150},
            {1000,    1,   5,     9, 1000},
            {1110,    2,   6,    10, 1110},
            {1220,    3,   7,    11, 1220},
            {1330,    4,   8,    12, 1330}
        };

    string jsonStr = JsonConvert.SerializeObject(b);

    Console.WriteLine(jsonStr);

    string path = "X:\\Programming\\workspaceEclipse\\PyTutorials\\src\\tensorflow_tutorials\\export.txt";

    File.WriteAllText(path, jsonStr);
}

8

如果您在ASP.NET MVC Web控制器中,则非常简单:

string ladAsJson = Json(Lad);

不敢相信没有人提到这一点。


1
我收到有关无法将jsonresult转换为字符串的错误。
csga5000 '16

它将使用隐式类型进行编译:var ladAsJson = Json(Lad)。
ewomack,2016年

3

我会为ServiceStack的JSON序列化程序投票:

using ServiceStack.Text

string jsonString = new { FirstName = "James" }.ToJson();

它也是适用于.NET的最快的JSON序列化程序:http : //www.servicestack.net/benchmarks/


4
这些是那里非常古老的基准。我刚刚测试了Newtonsoft,ServiceStack和JavaScriptSerializer的所有三个当前版本,目前Newtonsoft是最快的。他们都做得很快。
Michael Logutov

1
ServiceStack似乎不是免费的。
joelnet 2013年

@joelnet现在是这种情况,但是在回答问题时是免费的。但是,它对于小型站点是免费的,尽管它是付费的,但我仍在使用它,它是一个极好的框架。
詹姆斯

这里有一些基准测试,尽管没有单独
JohnLBevan

3

使用以下代码将XML转换为JSON。

var json = new JavaScriptSerializer().Serialize(obj);


3

如此简单(它也适用于动态对象(类型对象)):

string json = new
System.Web.Script.Serialization.JavaScriptSerializer().Serialize(MYOBJECT);

网络下没有默认脚本。:(
M在


我有点尝试过,但是没有。我想应该将脚本添加为参考。非常感谢
M在

0

序列化器

 public static void WriteToJsonFile<T>(string filePath, T objectToWrite, bool append = false) where T : new()
{
        var contentsToWriteToFile = JsonConvert.SerializeObject(objectToWrite, new JsonSerializerSettings
        {
            Formatting = Formatting.Indented,
        });
        using (var writer = new StreamWriter(filePath, append))
        {
            writer.Write(contentsToWriteToFile);
        }
}

宾语

namespace MyConfig
{
    public class AppConfigurationSettings
    {
        public AppConfigurationSettings()
        {
            /* initialize the object if you want to output a new document
             * for use as a template or default settings possibly when 
             * an app is started.
             */
            if (AppSettings == null) { AppSettings=new AppSettings();}
        }

        public AppSettings AppSettings { get; set; }
    }

    public class AppSettings
    {
        public bool DebugMode { get; set; } = false;
    }
}

实作

var jsonObject = new AppConfigurationSettings();
WriteToJsonFile<AppConfigurationSettings>(file.FullName, jsonObject);

输出量

{
  "AppSettings": {
    "DebugMode": false
  }
}
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.