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

Hui*_*Hui 868 .net c# serialization json

我有这样的课程:

class MyDate
{
    int year, month, day;
}

class Lad
{
    string firstName;
    string lastName;
    MyDate dateOfBirth;
}
Run Code Online (Sandbox Code Playgroud)

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

{
    "firstName":"Markoff",
    "lastName":"Chaney",
    "dateOfBirth":
    {
        "year":"1901",
        "month":"4",
        "day":"30"
    }
}
Run Code Online (Sandbox Code Playgroud)

(没有格式化).我找到了这个链接,但它使用的是一个不在.NET 4中的命名空间.我也听说过JSON.NET,但是他们的网站目前似乎已经关闭了,我并不热衷于使用外部DLL文件.除了手动创建JSON字符串编写器之外还有其他选项吗?

msc*_*ock 962

因为我们都喜欢一个衬里

...这个依赖于Newtonsoft NuGet包,它比默认的序列化器更受欢迎.

Newtonsoft.Json.JsonConvert.SerializeObject(new {foo = "bar"})
Run Code Online (Sandbox Code Playgroud)

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

  • Newtonsoft序列化程序的速度更快,可以自定义,然后内置.强烈建议使用它.谢谢@willsteel的答案 (130认同)
  • 如果您阅读[JavaScriptSerializer](https://msdn.microsoft.com/en-us/library/system.web.script.serialization.javascriptserializer.aspx)的MSDN文档,那么请说明使用JSON.net. (30认同)
  • @JosefPfleger的定价是JSON.NET Schema,而不是JSON.NET的常规序列化器,也就是麻省理工学院 (8认同)
  • 对于阅读本文的每个人,请注意这个答案非常非常古老。尽管 Newtonsoft.Json 仍然非常流行,并且可以完成这项工作,但请考虑使用其他答案中提到的新的(内置)System.Text.Json (6认同)
  • @JosefPfleger Newtionsoft JSON.net已获得MIT许可...您可以进行修改,然后将其转售给您。他们的定价页面涉及商业技术支持以及他们拥有的一些模式验证器。 (3认同)

Dar*_*rov 855

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

using System.Web.Script.Serialization;
Run Code Online (Sandbox Code Playgroud)
var json = new JavaScriptSerializer().Serialize(obj);
Run Code Online (Sandbox Code Playgroud)

一个完整的例子:

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 请记住,Microsoft建议使用JSON.net而不是此解决方案.我认为这个答案变得不合适了.看看willsteel的答案.资料来源:[https://msdn.microsoft.com/en-us/library/system.web.script.serialization.javascriptserializer.aspx](https://msdn.microsoft.com/en-us/library/system. web.script.serialization.javascriptserializer.aspx). (81认同)
  • @DarinDimitrov你应该考虑添加一个关于JSON.net的提示.Microsoft建议通过JavascriptSerializer:https://msdn.microsoft.com/en-us/library/system.web.script.serialization.javascriptserializer.aspx您还可以向https://msdn.microsoft.com/添加提示en-us/library/system.runtime.serialization.json.datacontractjsonserializer(v = vs.110).aspx这是包含框架的方法 (8认同)
  • 为什么微软会推荐第三方解决方案呢?他们的措辞也很奇怪:"Json.NET应该用于序列化和反序列化.为支持AJAX的应用程序提供序列化和反序列化功能." (5认同)
  • [此处](http://csharp2json.azurewebsites.net/) 是**在线工具**,用于将“类”转换为“json”格式,希望对某人有所帮助。 (2认同)
  • 请注意,要引用“System.Web.Extensions”,您的系统上必须安装“ASP.NET AJAX 1.0”或“ASP.NET 3.5”。请参阅此 /sf/ask/540644261/ (2认同)

小智 87

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

序列化为Json字符串:

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

var jsonString = Newtonsoft.Json.JsonConvert.SerializeObject(obj);
Run Code Online (Sandbox Code Playgroud)

反序列化为对象:

var obj = Newtonsoft.Json.JsonConvert.DeserializeObject<Lad>(jsonString );
Run Code Online (Sandbox Code Playgroud)


Edg*_*gar 55

使用DataContractJsonSerializer类:MSDN1,MSDN2.

我的例子:这里.

它也可以安全地从JSON字符串反序列化对象,不像JavaScriptSerializer.但我个人仍然喜欢Json.NET.

  • 更不用说它没有依赖于System.Web.Xyz命名空间...... (6认同)
  • 在 *那个页面* 上仍然没有看到任何示例,但这里有一些在 [MSDN](http://msdn.microsoft.com/en-us/library/bb412179(v=vs.110).aspx) 和[其他地方](http://www.joe-stevens.com/2009/12/29/json-serialization-using-the-datacontractjsonserializer-and-c/) -&gt; 最后一个使用扩展方法实现单行. (2认同)
  • 它不会序列化普通类.报告错误"考虑使用DataContractAttribute属性标记它,并标记要使用DataMemberAttribute属性序列化的所有成员.如果类型是集合,请考虑使用CollectionDataContractAttribute标记它." (2认同)

Jea*_*hel 21

Wooou!使用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
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

考试:

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();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

结果:

{
  "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
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

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


Wal*_*eed 15

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

using Newtonsoft.Json;

var jsonString = JsonConvert.SerializeObject(obj);
Run Code Online (Sandbox Code Playgroud)


tdy*_*tra 11

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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

说明文件:


Mim*_*ina 8

在 Lad 模型类中,添加对ToString()方法的重写 ,该方法返回 Lad 对象的 JSON 字符串版本。
注意:您需要导入System.Text.Json

using System.Text.Json;

class MyDate
{
    int year, month, day;
}

class Lad
{
    public string firstName { get; set; };
    public string lastName { get; set; };
    public MyDate dateOfBirth { get; set; };
    public override string ToString() => JsonSerializer.Serialize<Lad>(this);
}
Run Code Online (Sandbox Code Playgroud)

  • 附注:(1) 为了管理 json 序列化,类的属性必须至少有 getter,(2) `JsonSerializer.Serialize(lad)` 将所有内容打印在一行中;如果你想获得缩进的打印输出,请使用 json `options`,(3) 我宁愿像这样重写 `ToString()`: `public override string ToString() =&gt; JsonSerializer.Serialize(this, new JsonSerializerOptions { WriteIndented =正确});` (3认同)
  • `JsonSerializer.Serialize&lt;Lad&gt;(this)` 可以简化为 `JsonSerializer.Serialize(this)` (2认同)

Art*_*jev 8

2023 年 10 月更新:

另一种使用内置System.Text.Json(.NET Core 3.0+)的解决方案,其中对象是自给自足的并且不会公开所有可能的字段:

通过测试(使用 NUnit):

using NUnit.Framework;

namespace Intech.UnitTests
{
    public class UserTests
    {
        [Test]
        public void ConvertsItselfToJson()
        {
            var userName = "John";
            var user = new User(userName);

            var actual = user.ToJson();

            Assert.AreEqual($"{{\"Name\":\"{userName}\"}}", actual);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

一个实现:

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

namespace Intech
{
    public class User
    {
        private readonly string name;

        public User(string name)
        {
            this.name = name;
        }

        public string ToJson()
        {
            var params = new Dictionary<string, string>{{"Name", name}};
            return JsonSerializer.Serialize(params);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)


mic*_*ver 7

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

string ladAsJson = Json(Lad);
Run Code Online (Sandbox Code Playgroud)

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


use*_*627 7

如果它们不是很大,那么您的情况可能是将其导出为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);
    }
Run Code Online (Sandbox Code Playgroud)


Jam*_*mes 5

我会投票给 ServiceStack 的 JSON Serializer:

using ServiceStack;

string jsonString = new { FirstName = "James" }.ToJson();
Run Code Online (Sandbox Code Playgroud)

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

  • 这些都是非常古老的基准。我刚刚测试了 Newtonsoft、ServiceStack 和 JavaScriptSerializer 的所有三个当前版本,目前 Newtonsoft 是最快的。他们都做得很快。 (6认同)
  • @joelnet 现在似乎是免费的。不知道什么时候改的。 (2认同)