ฉันจะเปลี่ยนวัตถุ C # เป็นสตริง JSON ใน. NET ได้อย่างไร


944

ฉันมีชั้นเรียนเช่นนี้

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

(ไม่มีการจัดรูปแบบ) ผมพบว่าการเชื่อมโยงนี้แต่จะใช้ namespace ที่ไม่ได้อยู่ใน.NET 4 ฉันยังได้ยินเกี่ยวกับJSON.NETแต่เว็บไซต์ของพวกเขาดูเหมือนจะหยุดทำงานในขณะนี้และฉันไม่กระตือรือร้นที่จะใช้ไฟล์ DLL ภายนอก

มีตัวเลือกอื่นนอกเหนือจากการสร้างตัวเขียนสตริงJSONด้วยตนเองหรือไม่?


2
JSON.net สามารถโหลดได้ที่นี่อีกวิธีที่เร็วกว่า (ดังที่พวกเขาบอกว่า - ฉันไม่ได้ทดสอบด้วยตัวเอง) โซลูชันคือServiceStack.Textฉันไม่แนะนำให้ใช้เครื่องมือแยกวิเคราะห์ JSON ของคุณเอง มันอาจจะช้าลงและเกิดข้อผิดพลาดได้ง่ายขึ้นหรือคุณต้องใช้เวลามากมาย
Zebi

ใช่. C # มีประเภทที่เรียกว่า JavaScriptSerializer
Glenn Ferrie


2
อืม .. เท่าที่ฉันเห็นคุณควรจะสามารถใช้: msdn.microsoft.com/en-us/library/ ......ซึ่งอยู่ใน. Net 4.0 ตามหน้า MSDN คุณควรจะสามารถใช้วิธี Serialize (Object obj): msdn.microsoft.com/en-us/library/bb292287.aspxฉันขาดอะไรที่นี่หรือไม่ Btw ดูเหมือนว่าลิงก์คุณจะเป็นรหัสและไม่ใช่ลิงก์
Holger

ไม่พูดถึงมันมีการอ้างอิงที่ไม่มีใน namespaces System.Web.Xyz และ ...
เดฟ Jellison

คำตอบ:


898

คุณสามารถใช้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

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 ควรใช้การทำให้เป็นอนุกรมและการดีซีเรียลไลเซชัน
ป้องกัน One

1
เพียงอ้างอิงถึงSystem.Web.Extensionsคุณต้องมีASP.NET AJAX 1.0หรือASP.NET 3.5ติดตั้งในระบบของคุณ โปรดดูstackoverflow.com/questions/7723489/…
Sisir

1056

เนื่องจากเราทุกคนรักหนึ่งสมุทร

... อันนี้ขึ้นอยู่กับแพ็คเกจ Newtonsoft NuGet ซึ่งเป็นที่นิยมและดีกว่า serializer เริ่มต้น

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

เอกสารประกอบ: การทำให้เป็นอันดับและการเลิกทำการ JSON


134
Newtonsoft serializer เป็นวิธีที่เร็วขึ้นและปรับแต่งแล้วสร้างขึ้นมาขอแนะนำให้ใช้ ขอบคุณสำหรับคำตอบ @willsteel
Andrei

8
@JosefPfleger ราคาสำหรับ JSON.NET Schema ไม่ใช่ JSON.NET ซึ่งเป็น serializer ปกติซึ่งก็คือ MIT
David Cumps เมื่อ

1
การทดสอบของฉันแสดงให้เห็นว่า Newtonsoft ช้ากว่าคลาส JavaScriptSerializer (.NET 4.5.2)
พฤศจิกายน

31
หากคุณอ่านเอกสาร MSDN สำหรับJavaScriptSerializerเอกสารจะถูกยกเลิกการใช้ JSON.net
dsghi

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ระดับ: MSDN1 , MSDN2

ตัวอย่างของฉัน: ที่นี่

นอกจากนี้ยังสามารถได้อย่างปลอดภัย deserialize วัตถุจากสตริง JSON JavaScriptSerializerซึ่งแตกต่างจาก แต่โดยส่วนตัวฉันยังชอบJson.NETอยู่


1
ยังไม่เห็นตัวอย่างใด ๆ ในหน้านั้น แต่นี่คือตัวอย่างบางส่วนในMSDNและที่อื่น ๆ -> อันสุดท้ายใช้วิธีการขยายเพื่อให้ได้หนึ่งตอร์ปิโด
Cristian Diaconescu

โอ้ฉันพลาดลิงค์ MSDN ครั้งที่ 2 :)
Cristian Diaconescu

2
มันไม่ได้ทำให้เป็นคลาสธรรมดา ข้อผิดพลาดที่รายงาน "พิจารณาการทำเครื่องหมายด้วยแอตทริบิวต์ DataContractAttribute และทำเครื่องหมายสมาชิกทั้งหมดที่คุณต้องการต่อเนื่องกับแอตทริบิวต์ DataMemberAttribute หากประเภทเป็นคอลเล็กชันให้พิจารณาทำเครื่องหมายด้วย CollectionDataContractAttribute"
Michael Freidgeim

@MichaelFreidgeim ถูกต้องคุณต้องทำเครื่องหมายคุณสมบัติในคลาสที่คุณต้องการทำให้เป็นอันดับด้วยคุณสมบัติ DataContractAttribute DataMemberAttribute
Edgar

1
@MichaelFreidgeim ไหนดีขึ้นอยู่กับความต้องการ แอ็ตทริบิวต์ให้คุณกำหนดค่าวิธีการที่คุณสมบัติเป็นอนุกรม
เอ็ดการ์

24

คุณสามารถทำได้โดยใช้ Newtonsoft.json ติดตั้ง Newtonsoft.json จาก NuGet แล้ว:

using Newtonsoft.Json;

var jsonString = JsonConvert.SerializeObject(obj);

22

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

การทดสอบ:

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

20

JSON serializer ใหม่นั้นมีอยู่ในSystem.Text.Jsonnamespace มันรวมอยู่ใน. 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.Jsonserializer ขณะนี้ไม่เป็นอันดับสาขา

เอกสารอ้างอิง:


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 มันง่ายเหมือน:

string ladAsJson = Json(Lad);

ไม่อยากเชื่อเลยว่าจะไม่มีใครพูดถึงเรื่องนี้


1
ฉันได้รับข้อผิดพลาดเกี่ยวกับการไม่สามารถใช้ jsonresult กับสตริงได้
csga5000

มันจะรวบรวมด้วยการพิมพ์โดยนัย: var ladAsJson = Json (Lad)
ewomack

3

ฉันจะลงคะแนนให้ JSON Serializer ของ ServiceStack:

using ServiceStack.Text

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

นอกจากนี้ยังเป็น JSON serializer ที่เร็วที่สุดสำหรับ. NET: http://www.servicestack.net/benchmarks/


4
นั่นเป็นเกณฑ์มาตรฐานที่เก่าแก่มาก ฉันเพิ่งทดสอบ Newtonsoft, ServiceStack และ JavaScriptSerializer ทั้งสามเวอร์ชันปัจจุบันและปัจจุบัน Newtonsoft นั้นเร็วที่สุด แม้ว่าพวกเขาจะทำค่อนข้างเร็ว
Michael Logutov

1
ServiceStack ดูเหมือนจะไม่ว่าง
joelnet

@joelnet เป็นกรณีนี้ แต่เป็นอิสระเมื่อตอบคำถาม อย่างไรก็ตามมันฟรีสำหรับไซต์เล็ก ๆ และฉันยังคงใช้มันแม้ว่าจะได้รับเงินแล้วมันเป็นกรอบที่ยอดเยี่ยม
James

มาตรฐานบางอย่างที่นี่แม้ว่าจะไม่ได้มีการทำให้เป็นอนุกรมสำหรับตัวมันเอง: docs.servicestack.net/real-world-performance
JohnLBevan

3

ใช้รหัสด้านล่างสำหรับการแปลง XML เป็น JSON

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


3

มันเป็นเรื่องง่ายเหมือนนี้ (ใช้งานได้กับวัตถุแบบไดนามิกเช่นกัน (วัตถุประเภท)):

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

ไม่มีสคริปต์เริ่มต้นภายใต้เว็บ :(
. เมื่อ

คุณกำลังมองหาสิ่งนี้: msdn.microsoft.com/en-us/library/…
MarzSocks

ฉันพยายามแบบนั้น แต่ไม่ สคริปต์ฉันคิดว่าฉันควรเพิ่มเป็นข้อมูลอ้างอิง ขอบคุณมาก
. ที่

0

serializer

 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
  }
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.