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

How do I turn a C# object into a JSON string in .NET?

我有这样的课程:

1
2
3
4
5
6
7
8
9
10
11
class MyDate
{
    int year, month, day;
}

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

我想把一个Lad对象转换成这样的JSON字符串:

1
2
3
4
5
6
7
8
9
10
{
   "firstName":"Markoff",
   "lastName":"Chaney",
   "dateOfBirth":
    {
       "year":"1901",
       "month":"4",
       "day":"30"
    }
}

(不带格式)。我找到了这个链接,但它使用的名称空间不在.NET 4中。我也听说过json.net,但他们的网站目前似乎已经关闭了,我不喜欢使用外部的dll文件。除了手动创建JSON字符串编写器之外,还有其他选项吗?


既然我们都喜欢一句话

…这一个依赖于newtonsoft nuget包,这是流行的,比默认的序列化程序更好。

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

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


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

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

一个完整的例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
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);
    }
}


使用json.net库,您可以从nuget包管理器下载它。

序列化为JSON字符串:

1
2
3
4
5
6
7
8
9
10
11
12
13
 var obj = new Lad
        {
            firstName ="Markoff",
            lastName ="Chaney",
            dateOfBirth = new MyDate
            {
                year = 1901,
                month = 4,
                day = 30
            }
        };

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

正在反序列化到对象:

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

使用DataContractJsonSerializer类:msdn1、msdn2。

我的例子:这里。

它还可以从JSON字符串安全地反序列化对象,与JavaScriptSerializer不同。但我个人还是喜欢json.net。


Wooou!使用JSON框架更好:)

下面是我使用json.net(http://james.newtonking.com/json)的示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
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
        }
    }
}

测试:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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","15o 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();
        }
    }
}

结果:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
{
 "id": 1,
 "name":"Ayrton Senna",
 "addresses": [
    {
     "id": 1,
     "streetAddress":"Rua Dr. Fernandes Coelho, 85",
     "complement":"15o 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字符串并填充类的字段。


如果它们不是很大,那么您的案例将其导出为JSON。这使得所有平台都可以移植

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
 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);
    }


如果您使用的是ASP.NET MVC Web控制器,那么它的简单程度如下:

1
string ladAsJson = Json(Lad);

真不敢相信没人提到这件事。


使用此工具生成C类,然后使用此代码序列化对象

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

同样简单,也适用于动态对象(类型对象):

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


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

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

我将投票支持ServiceStack的JSON序列化程序:

1
2
3
using ServiceStack.Text

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

它也是.NET中最快的JSON序列化程序:http://www.servicestack.net/基准/


这里有一个非常漂亮的实用程序:http://csharp2json.io/


串行化器

1
2
3
4
5
6
7
8
9
10
11
 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);
        }
}

对象

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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;
    }
}

实施

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

产量

1
2
3
4
5
{
 "AppSettings": {
   "DebugMode": false
  }
}

还要注意创建具有正确属性的类:

根据示例c example后跟vb.net exmpale,使用属性创建此类

C.*

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
using Microsoft.VisualBasic;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.Diagnostics;
using System.Web;
using System.Web.Script.Serialization;
namespace Samples
{
[Serializable()]
public class Customer
{


    private int _idcustomer;
    public int IDCustomer {
        get { return _idcustomer; }
        set { _idcustomer = value; }
    }


    private System.DateTime _RegistrationDate;
    public System.DateTime RegistrationDate {
        get { return _RegistrationDate; }
        set { _RegistrationDate = value; }
    }


    private string _Name;
    public string Name {
        get { return _Name; }
        set { _Name = value; }
    }


    private string _Surname;
    public string Surname {
        get { return _Surname; }
        set { _Surname = value; }
    }
}


[Serializable()]
public class Product
{


    private int _ProductID;
    public int ProductID {
        get { return _ProductID; }
        set { _ProductID = value; }
    }


    private string _ProductName;
    public string ProductName {
        get { return _ProductName; }
        set { _ProductName = value; }
    }


    private int _Price;
    public int Price {
        get { return _Price; }
        set { _Price = value; }
    }


    private bool _inStock;
    public bool inStock {
        get { return _inStock; }
        set { _inStock = value; }
    }
}


[Serializable()]
public class Order
{


    private int _OrderId;
    public int OrderID {
        get { return _OrderId; }
        set { _OrderId = value; }
    }


    private int _customerID;
    public int CustomerID {
        get { return _customerID; }
        set { _customerID = value; }
    }


    private List<Product> _ProductsList;
    public List<Product> ProductsList {
        get { return _ProductsList; }
        set { _ProductsList = value; }
    }


    private System.DateTime _PurchaseDate;
    public System.DateTime PurchaseDate {
        get { return _PurchaseDate; }
        set { _PurchaseDate = value; }
    }


    private string _PaymentMethod;
    public string PaymentMethod {
        get { return _PaymentMethod; }
        set { _PaymentMethod = value; }
    }

    public string ToJson()
    {
        string json = string.Empty;
        JavaScriptSerializer js = new JavaScriptSerializer();
        json = js.Serialize(this);
        js = null;
        return json;
    }

}

}

VBNET实例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
Imports System
Imports System.Web
Imports System.Web.Script.Serialization
Namespace Samples
<Serializable()>
Public Class Customer

    Private _idcustomer As Integer

    Public Property IDCustomer() As Integer
        Get
            Return _idcustomer
        End Get
        Set(ByVal value As Integer)
            _idcustomer = value
        End Set
    End Property

    Private _RegistrationDate As Date

    Public Property RegistrationDate() As Date
        Get
            Return _RegistrationDate
        End Get
        Set(ByVal value As Date)
            _RegistrationDate = value
        End Set
    End Property

    Private _Name As String

    Public Property Name() As String
        Get
            Return _Name
        End Get
        Set(ByVal value As String)
            _Name = value
        End Set
    End Property

    Private _Surname As String

    Public Property Surname() As String
        Get
            Return _Surname
        End Get
        Set(ByVal value As String)
            _Surname = value
        End Set
    End Property
End Class


<Serializable()>
Public Class Product

    Private _ProductID As Integer

    Public Property ProductID() As Integer
        Get
            Return _ProductID
        End Get
        Set(ByVal value As Integer)
            _ProductID = value
        End Set
    End Property

    Private _ProductName As String

    Public Property ProductName() As String
        Get
            Return _ProductName
        End Get
        Set(ByVal value As String)
            _ProductName = value
        End Set
    End Property

    Private _Price As Integer

    Public Property Price() As Integer
        Get
            Return _Price
        End Get
        Set(ByVal value As Integer)
            _Price = value
        End Set
    End Property

    Private _inStock As Boolean

    Public Property inStock() As Boolean
        Get
            Return _inStock
        End Get
        Set(ByVal value As Boolean)
            _inStock = value
        End Set
    End Property
End Class


<Serializable>
Public Class Order

    Private _OrderId As Integer

    Public Property OrderID() As Integer
        Get
            Return _OrderId
        End Get
        Set(ByVal value As Integer)
            _OrderId = value
        End Set
    End Property

    Private _customerID As Integer

    Public Property CustomerID() As Integer
        Get
            Return _customerID
        End Get
        Set(ByVal value As Integer)
            _customerID = value
        End Set
    End Property

    Private _ProductsList As List(Of Product)

    Public Property ProductsList() As List(Of Product)
        Get
            Return _ProductsList
        End Get
        Set(ByVal value As List(Of Product))
            _ProductsList = value
        End Set
    End Property

    Private _PurchaseDate As Date

    Public Property PurchaseDate() As Date
        Get
            Return _PurchaseDate
        End Get
        Set(ByVal value As Date)
            _PurchaseDate = value
        End Set
    End Property

    Private _PaymentMethod As String

    Public Property PaymentMethod() As String
        Get
            Return _PaymentMethod
        End Get
        Set(ByVal value As String)
            _PaymentMethod = value
        End Set
    End Property

    Public Function ToJson() As String
        Dim json As String = String.Empty
        Dim js As New JavaScriptSerializer
        json = js.Serialize(Me)
        js = Nothing
        Return json
    End Function

End Class

结束命名空间

第二步是创建这样一个简单的测试数据:

C.*

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
  void Main() {
    List<Samples.Product> ListProducts = new List<Samples.Product>();
    ListProducts.Add(new Samples.Product(), With, {.inStock=False,.Price=10, .ProductID=1,.ProductName=BookOne);
    ListProducts.Add(new Samples.Product(), With, {.inStock=False,. Price=10, .ProductID=2, .ProductName=Hotels California);
    ListProducts.Add(new Samples.Product(), With, {.inStock=False,.Price=10,.ProductID=3,.ProductName=Cbr);
    ListProducts.Add(new Samples.Product(), With, {.inStock=False,.Price=10,.ProductID=4,.ProductName=Mustang);
    ListProducts.Add(new Samples.Product(), With, {.inStock=False,.Price=10, .ProductID=15,.ProductName=Anything);
    ListProducts.Add(new Samples.Product(), With, {.inStock=False,.Price=10,.ProductID=38,.ProductName=Monster Truck);
    Samples.Customer Customer = new Samples.Customer();
    // With...
    Customer.IDCustomer = 1;
    Customer.Name ="Customer1";
    Customer.RegistrationDate = Now;
    Customer.Surname ="SurnameCustomer";
    Samples.Order Order = new Samples.Order();
    // With...
    Order.CustomerID = Customer.IDCustomer;
    Order.OrderID = 1;
    Order.PaymentMethod ="PayPal";
    Order.ProductsList = ListProducts;
    Order.PurchaseDate = Now;
    Console.WriteLine(Order.ToJson);
    Console.ReadLine();
}

VB.NET

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
Sub Main()
    Dim ListProducts As New List(Of Samples.Product)

    ListProducts.Add(New Samples.Product With {.inStock = False, .Price = 10,
                     .ProductID = 1, .ProductName ="BookOne"})
    ListProducts.Add(New Samples.Product With {.inStock = False, .Price = 10,
                     .ProductID = 2, .ProductName ="Hotels California"})
    ListProducts.Add(New Samples.Product With {.inStock = False, .Price = 10,
                     .ProductID = 3, .ProductName ="Cbr"})
    ListProducts.Add(New Samples.Product With {.inStock = False, .Price = 10,
                     .ProductID = 4, .ProductName ="Mustang"})
    ListProducts.Add(New Samples.Product With {.inStock = False, .Price = 10,
                     .ProductID = 15, .ProductName ="Anything"})
    ListProducts.Add(New Samples.Product With {.inStock = False, .Price = 10,
                     .ProductID = 38, .ProductName ="Monster Truck"})

    Dim Customer As New Samples.Customer
    With {.IDCustomer = 1, .Name ="Customer1",.RegistrationDate = Now, .Surname  ="SurnameCustomer"}

    Dim Order As New Samples.Order With {
        .CustomerID = Customer.IDCustomer,
        .OrderID =       1,
        .PaymentMethod ="PayPal",
        .ProductsList = ListProducts,
        .PurchaseDate = Now
    }
    Console.WriteLine(Order.ToJson)
    Console.ReadLine()
End Sub

这是最后的结果:

1
2
3
4
5
6
7
{"OrderID":1,"CustomerID":1,"ProductsList":[{"ProductID":1,"ProductName":"BookOn
 e"
,"Price":10,"inStock":false},{"ProductID":2,"ProductName":"Hotels California",
"Price":10,"inStock":false},{"ProductID":3,"ProductName":"Cbr","Price":10,"inSto
 ck"
:false},{"ProductID":4,"ProductName":"Mustang","Price":10,"inStock":false},{"
 ProductID"
:15,"ProductName":"Anything","Price":10,"inStock":false},{"ProductID":
 38,"ProductName":"Monster Truck","Price":10,"inStock":false}],"PurchaseDate":"\/
 Date(1396642206155)\/"
,"PaymentMethod":"PayPal"}

请记住添加对system.web.extension.dll的引用,以实现您的目标。