Làm cách nào để biến đối tượng C # thành chuỗi JSON trong .NET?


944

Tôi có các lớp như thế này:

class MyDate
{
    int year, month, day;
}

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

Và tôi muốn biến một Ladđối tượng thành một chuỗi JSON như thế này:

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

(không có định dạng). Tôi đã tìm thấy liên kết này , nhưng nó sử dụng một không gian tên không có trong .NET 4 . Tôi cũng đã nghe nói về JSON.NET , nhưng hiện tại trang web của họ đã ngừng hoạt động và tôi không thích sử dụng các tệp DLL bên ngoài.

Có các tùy chọn khác ngoài việc tạo thủ công trình soạn thảo chuỗi JSON không?


2
JSON.net có thể được tải ở đây Một giải pháp khác và nhanh hơn (như họ nói - Tôi không tự kiểm tra) giải pháp là ServiceStack. Tiếp theo tôi không khuyên bạn nên sử dụng trình phân tích cú pháp JSON của riêng bạn. Nó có thể sẽ chậm hơn và dễ bị lỗi hơn hoặc bạn phải đầu tư nhiều thời gian.
Zebi

Đúng. C # có một loại được gọi là JavaScriptSerializer
Glenn Ferrie


2
Hừm .. theo như tôi có thể thấy bạn sẽ có thể sử dụng: msdn.microsoft.com/en-us/l Library /. Cái nào cũng có trong .Net 4.0 theo trang MSDN. Bạn sẽ có thể sử dụng phương thức Nối tiếp (Object obj): msdn.microsoft.com/en-us/l Library / bb292287.aspx Tôi có thiếu điều gì ở đây không? Btw. liên kết của bạn dường như là một số mã và không phải là một liên kết
Holger

Chưa kể nó không có sự phụ thuộc vào các không gian tên System.Web.Xyz ...
Dave Jellison

Câu trả lời:


899

Bạn có thể sử dụng JavaScriptSerializerlớp (thêm tham chiếu vào System.Web.Extensions):

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

Một ví dụ đầy đủ:

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
Xin lưu ý rằng Microsoft đề nghị sử dụng JSON.net thay vì giải pháp này. Tôi nghĩ rằng câu trả lời này đã trở nên không phù hợp. Hãy xem câu trả lời của willsteel. Nguồn: https://msdn.microsoft.com/en-us/l Library / system.web.script.serialization.javascriptserializer.aspx .
rzelek

9
@DarinDimitrov bạn nên xem xét thêm một gợi ý về JSON.net. Microsoft khuyến cáo nó trên JavascriptSerializer: msdn.microsoft.com/en-us/library/... Bạn cũng có thể thêm một gợi ý để msdn.microsoft.com/en-us/library/... đó là khuôn khổ bao gồm cách tiếp cận
Mafii

đâycông cụ trực tuyến để chuyển đổi của bạn classesđể jsonđịnh dạng, hy vọng sẽ giúp một ai đó.
shaijut

6
Tại sao Microsoft lại đề xuất giải pháp bên thứ 3 cho chính họ? Từ ngữ của họ cũng rất kỳ quặc: "Json.NET nên được sử dụng tuần tự hóa và giải tuần tự hóa. Cung cấp chức năng tuần tự hóa và giải tuần tự hóa cho các ứng dụng hỗ trợ AJAX."
Người bảo vệ một

1
Chỉ cần một cái đầu lên, để tham khảo System.Web.Extensions, bạn phải có ASP.NET AJAX 1.0hoặc ASP.NET 3.5cài đặt trên hệ thống của bạn. Vui lòng xem stackoverflow.com/questions/7723361/
Sisir

1056

Vì tất cả chúng ta đều yêu thích một lớp lót

... cái này phụ thuộc vào gói NuGet của Newtonsoft, nó phổ biến và tốt hơn bộ nối tiếp mặc định.

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

Tài liệu: Tuần tự hóa và giải tuần tự JSON


134
Newtonsoft serializer là cách nhanh hơn và tùy biến mor sau đó được tích hợp. Rất khuyến khích sử dụng nó. Cảm ơn câu trả lời @willsteel
Andrei

8
@JosefPfleger việc định giá dành cho Lược đồ JSON.NET, không phải JSON.NET là trình tuần tự hóa thông thường, đó là MIT
David Cumps

1
Thử nghiệm của tôi cho thấy Newtonsoft chậm hơn lớp JavaScriptSerializer. (.NET 4.5.2)
nemke

31
Nếu bạn đọc tài liệu MSDN cho JavaScriptSerializer , thì nó sẽ nói rằng hãy sử dụng JSON.net.
DSghi

3
@JosefPfleger Newtionsoft JSON.net được MIT cấp phép ... bạn có thể sửa đổi và bán lại nó như bạn muốn. Trang định giá của họ là về hỗ trợ kỹ thuật thương mại và một số trình xác nhận lược đồ mà họ có.
cb88

95

Sử dụng thư viện Json.Net , bạn có thể tải xuống từ Nuget Packet Manager.

Nối tiếp với chuỗi 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);

Giải trừ đối tượng:

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

57

Sử dụng DataContractJsonSerializerlớp: MSDN1 , MSDN2 .

Ví dụ của tôi: TẠI ĐÂY .

Nó cũng có thể giải nén các đối tượng một cách an toàn từ một chuỗi JSON, không giống như JavaScriptSerializer. Nhưng cá nhân tôi vẫn thích Json.NET .


1
Vẫn không thấy bất kỳ ví dụ nào trên trang đó , nhưng đây là một số trên MSDNcác nơi khác -> cái cuối cùng sử dụng các phương thức mở rộng để đạt được một lớp lót.
Cristian Diaconescu

Ồ, tôi đã bỏ lỡ liên kết MSDN thứ 2 :)
Cristian Diaconescu

2
Nó không tuần tự hóa các lớp đơn giản. Lỗi đã báo cáo "Xem xét đánh dấu nó bằng thuộc tính DataContractAttribution và đánh dấu tất cả các thành viên mà bạn muốn tuần tự hóa bằng thuộc tính DataMemberAttribution. Nếu loại là một bộ sưu tập, hãy xem xét đánh dấu nó bằng CollectionDataContractAttribution."
Michael Freidgeim

@MichaelFreidgeim Đúng vậy, bạn phải đánh dấu các thuộc tính trong lớp bạn muốn tuần tự hóa với các thuộc tính. DataContractAttribution DataMemberAttribution
Edgar

1
@MichaelFreidgeim Cái nào tốt hơn phụ thuộc vào yêu cầu. Các thuộc tính cho phép bạn định cấu hình cách thuộc tính được tuần tự hóa.
Edgar

24

Bạn có thể đạt được điều này bằng cách sử dụng Newtonsoft.json. Cài đặt Newtonsoft.json từ NuGet. Và sau đó:

using Newtonsoft.Json;

var jsonString = JsonConvert.SerializeObject(obj);

22

Wooou! Thực sự tốt hơn khi sử dụng khung JSON :)

Dưới đây là ví dụ của tôi khi sử dụng 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
        }
    }
}

Các bài kiểm tra:

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();
        }
    }
}

Kết quả:

{
  "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
    }
  ]
}

Bây giờ tôi sẽ triển khai phương thức constructor sẽ nhận chuỗi JSON và điền vào các trường của lớp.


1
Bài đăng tốt, đây là cách mới nhất để làm điều đó.
MatthewD

20

Một serializer JSON mới có sẵn trong System.Text.Jsonkhông gian tên. Nó được bao gồm trong khung chia sẻ .NET Core 3.0 và nằm trong gói NuGet cho các dự án nhắm mục tiêu .NET Standard hoặc .NET Framework hoặc .NET Core 2.x.

Mã ví dụ:

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);
    }
}

Trong ví dụ này, các lớp được tuần tự hóa có các thuộc tính hơn là các trường; cácSystem.Text.Json tuần tự hóa hiện không tuần tự hóa các trường.

Tài liệu:


9

Nếu chúng không lớn lắm, có lẽ trường hợp của bạn xuất nó dưới dạng JSON.

Ngoài ra điều này làm cho nó di động trong số tất cả các nền tảng.

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

Nếu bạn đang ở trong một bộ điều khiển web ASP.NET MVC, nó đơn giản như:

string ladAsJson = Json(Lad);

Không thể tin rằng không ai đã đề cập đến điều này.


1
Tôi gặp lỗi về việc không thể chuyển jsonresult thành chuỗi.
csga5000

Nó sẽ biên dịch với kiểu gõ ngầm: var ladAsJson = Json (Lad).
ewomack 7/11/2016

3

Tôi sẽ bỏ phiếu cho Trình tuần tự JSON của ServiceStack:

using ServiceStack.Text

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

Nó cũng là trình tuần tự hóa JSON nhanh nhất có sẵn cho .NET: http://www.servicestack.net/benchmark/


4
Đó là những tiêu chuẩn rất cũ ở đó. Tôi vừa mới thử nghiệm cả ba phiên bản hiện tại của Newtonsoft, ServiceStack và JavaScriptSerializer và hiện tại Newtonsoft là phiên bản nhanh nhất. Tho họ đều làm khá nhanh.
Michael Logutov

1
ServiceStack dường như không miễn phí.
joelnet

@joelnet đây là trường hợp này, nhưng đã miễn phí khi trả lời câu hỏi. Tuy nhiên, nó là miễn phí cho các trang web nhỏ và tôi vẫn đang sử dụng nó mặc dù được trả tiền, nhưng nó là một khung tuyệt vời.
James

Một số điểm chuẩn ở đây, mặc dù không có bản
ri

3

Sử dụng mã dưới đây để chuyển đổi XML sang JSON.

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


3

Nó cũng dễ như thế này (nó cũng hoạt động cho các đối tượng động (kiểu đối tượng)):

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

không có tập lệnh mặc định dưới web. :(
M lúc

Bạn đang tìm kiếm cái này: msdn.microsoft.com/en-us/l
Library / từ

Tôi đã thử nhưng không. Script tôi đoán tôi nên thêm nó làm tài liệu tham khảo. Cảm ơn rất nhiều
M vào

0

Bộ nối tiếp

 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);
        }
}

Vật

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;
    }
}

Thực hiện

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

Đầu ra

{
  "AppSettings": {
    "DebugMode": false
  }
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.