วิธีสร้างสตริง JSON ใน C #


238

ฉันเพิ่งใช้ XmlWriter เพื่อสร้าง XML เพื่อส่งกลับในการตอบสนอง HTTP คุณจะสร้างสตริง JSON อย่างไร ฉันคิดว่าคุณเพียงแค่ใช้ stringbuilder เพื่อสร้างสตริง JSON และพวกเขาจัดรูปแบบการตอบสนองของคุณเป็น JSON?


ตรวจสอบ 3 วิธีนี้ในการแปลงข้อมูลเป็นสตริง JSON ใน Asp.net C # codepedia.info/2015/07/..
Satinder เมื่อ

คำตอบ:


249

คุณสามารถใช้คลาส JavaScriptSerializerตรวจสอบบทความนี้เพื่อสร้างวิธีการขยายที่มีประโยชน์

รหัสจากบทความ:

namespace ExtensionMethods
{
    public static class JSONHelper
    {
        public static string ToJSON(this object obj)
        {
            JavaScriptSerializer serializer = new JavaScriptSerializer();
            return serializer.Serialize(obj);
        }

        public static string ToJSON(this object obj, int recursionDepth)
        {
            JavaScriptSerializer serializer = new JavaScriptSerializer();
            serializer.RecursionLimit = recursionDepth;
            return serializer.Serialize(obj);
        }
    }
}

การใช้งาน:

using ExtensionMethods;

...

List<Person> people = new List<Person>{
                   new Person{ID = 1, FirstName = "Scott", LastName = "Gurthie"},
                   new Person{ID = 2, FirstName = "Bill", LastName = "Gates"}
                   };


string jsonString = people.ToJSON();

ใช่เพียงแค่พยายามคิดวิธีการสร้างข้อความ JSON ก่อน ขอบคุณ
PositiveGuy

ถ้าคุณไม่ได้ใช้. NET 3.5! da ** it
PositiveGuy

2
JavaScriptSerializer เป็นส่วนหนึ่งของ ASP.NET Ajax 1.0 หากคุณต้องการใช้จาก. NET 2.0
Joe Chung

2
คุณยังสามารถใช้งานได้ เป็นส่วนหนึ่งของ ASP.NET 2.0 AJAX ส่วนขยาย 1.0: asp.net/AJAX/Documentation/Live/mref/...
Naren

โครงการของเราสามารถเปิดได้ในปี 2008 ... ดังนั้นมันจึงถูกดัดแปลงในบางจุด หมายความว่าตอนนี้เราสามารถใช้. NET 3.5 ภายใน codebase ที่มีอยู่ของเรา
PositiveGuy

366

ใช้ Newtonsoft.Jsonทำให้ง่ายขึ้นจริงๆ:

Product product = new Product();
product.Name = "Apple";
product.Expiry = new DateTime(2008, 12, 28);
product.Price = 3.99M;
product.Sizes = new string[] { "Small", "Medium", "Large" };

string json = JsonConvert.SerializeObject(product);

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


8
MS จัดส่ง NewtonSoft เป็นมาตรฐานในเทมเพลตโครงการ VS MVC4
Chris F Carroll

45
คุณสามารถทำให้วัตถุที่ไม่ระบุชื่อเป็นอนุกรมได้เมื่อต้องการ: string json = JsonConvert.SerializeObject(new { "PropertyA" = obj.PropertyA });.
Matt Beckman

9
@MattBeckman ฉันได้รับ "ประกาศสมาชิกไม่ระบุชื่อประเภทไม่ถูกต้องสมาชิกประเภทไม่ระบุชื่อจะต้องประกาศด้วยการมอบหมายสมาชิกชื่อง่ายหรือการเข้าถึงสมาชิกไม่ควร"PropertyA"จะเป็นPropertyAอย่างไร
Jonah

ดังนั้นเราต้องใช้คลาสและวัตถุเพื่อสร้าง json อย่างง่าย! ลองนึกภาพซ้อนกัน - ไม่คงที่อาร์เรย์ - องค์ประกอบ ฉันไม่เห็นว่าทำไมความกระตือรือร้นในอากาศมากนัก!
Vassilis

6
@MattBeckman @Jonah string json = JsonConvert.SerializeObject(new { PropertyA = obj.PropertyA });ไม่มีการเสนอราคาซ้ำPropertyA.
Jose

18

ห้องสมุดนี้ดีมากสำหรับ JSON จาก C #

http://james.newtonking.com/pages/json-net.aspx


1
ให้ฉันถามสิ่งที่เป็นประโยชน์ในการใช้กรอบนี้เมื่อเทียบกับวิธีการช่วยเหลือที่ CMS ดังกล่าวข้างต้น?
PositiveGuy

1
ช่วยให้คุณเมล็ดปลีกย่อยมากกว่า JSON เช่นคุณสามารถระบุจะรวม nulls หรือไม่ ฯลฯ
redsquare

17

ใช้ Simlpe ของNewtonsoft.JsonและNewtonsoft.Json.Linqห้องสมุด

        //Create my object
        var my_jsondata = new
        {
            Host = @"sftp.myhost.gr",
            UserName = "my_username",
            Password = "my_password",
            SourceDir = "/export/zip/mypath/",
            FileName = "my_file.zip"
        };

        //Tranform it to Json object
        string json_data = JsonConvert.SerializeObject(my_jsondata);

        //Print the Json object
        Console.WriteLine(json_data);

        //Parse the json object
        JObject json_object = JObject.Parse(json_data);

        //Print the parsed Json object
        Console.WriteLine((string)json_object["Host"]);
        Console.WriteLine((string)json_object["UserName"]);
        Console.WriteLine((string)json_object["Password"]);
        Console.WriteLine((string)json_object["SourceDir"]);
        Console.WriteLine((string)json_object["FileName"]);

ง่ายและสะดวก ขอบคุณ
QMaster

13

ตัวอย่างรหัสนี้ใช้ DataContractJsonSerializer จาก System.Runtime.Serialization.Json ใน. NET 3.5

public static string ToJson<T>(/* this */ T value, Encoding encoding)
{
    var serializer = new DataContractJsonSerializer(typeof(T));

    using (var stream = new MemoryStream())
    {
        using (var writer = JsonReaderWriterFactory.CreateJsonWriter(stream, encoding))
        {
            serializer.WriteObject(writer, value);
        }

        return encoding.GetString(stream.ToArray());
    }
}

3
ดังนั้น ... ไม่ใส่ข้อคิดเห็นการอ้างอิง 'นี่' เพื่อให้ตัวอย่างข้อมูลนี้ทำงานจริง หากคุณไม่เคยทำงานกับวิธีการขยายมาก่อนนี่อาจไม่ชัดเจน
Dan Esparza

7

ลองดูที่http://www.codeplex.com/json/สำหรับโครงการ json-net.aspx ทำไมต้องคิดค้นล้อใหม่


3
ฉันอาจไม่ต้องการพึ่งปลั๊กอินโอเพ่นซอร์สของบุคคลที่สามเพียงเพื่อสร้าง JSON ค่อนข้างจะสร้างวิธีการสตริง / ผู้ช่วยตัวเอง
PositiveGuy

7

คุณสามารถลองใช้ ServiceStack JsonSerializerของฉันซึ่งเป็นserializer .NET JSON ที่เร็วที่สุดในขณะนี้ รองรับการทำ DataContracts, POCO ทุกประเภท, อินเทอร์เฟซ, วัตถุที่ถูก จำกัด ขอบเขตรวมถึงประเภทที่ไม่ระบุชื่อ ฯลฯ

ตัวอย่างพื้นฐาน

var customer = new Customer { Name="Joe Bloggs", Age=31 };
var json = JsonSerializer.SerializeToString(customer);
var fromJson = JsonSerializer.DeserializeFromString<Customer>(json); 

หมายเหตุ: ใช้ Microsofts JavaScriptSerializer เฉพาะในกรณีที่ประสิทธิภาพการทำงานของคุณไม่สำคัญกับคุณเนื่องจากฉันต้องปล่อยให้มันอยู่ในเกณฑ์มาตรฐานของฉันเนื่องจากมันช้ากว่า40x-100xมากกว่า JSON serializers อื่น ๆ


ฉันลอง JsonSerializer.SerializeToString ด้วยรายการของวัตถุและเพิ่งกลับมาว่าง json: "[{}, {}]" pastebin.com/yEw57L3T นี่คือลักษณะของวัตถุของฉันก่อนที่ฉันจะเรียก SerializeToString i.imgur.com/dYIE7J1.pngคำตอบที่ได้รับการโหวตสูงสุดจากที่นี่ใช้งานได้ แต่กลับมาที่สิ่งที่ฉันคาดไว้: pastebin.com/aAtB3Gxu
Matthew Lock

การเชื่อมโยง serializer .NET JSON ที่เร็วที่สุดนั้นตายไป

6

หากคุณต้องการผลลัพธ์ที่ซับซ้อน (ฝัง) สร้างโครงสร้างของคุณเอง:

class templateRequest
{
    public String[] registration_ids;
    public Data data;
    public class Data
    {
        public String message;
        public String tickerText;
        public String contentTitle;
        public Data(String message, String tickerText, string contentTitle)
        {
            this.message = message;
            this.tickerText = tickerText;
            this.contentTitle = contentTitle;
        }                
    };
}

จากนั้นคุณสามารถรับสตริง JSON ด้วยการโทร

List<String> ids = new List<string>() { "id1", "id2" };
templateRequest request = new templeteRequest();
request.registration_ids = ids.ToArray();
request.data = new templateRequest.Data("Your message", "Your ticker", "Your content");

string json = new JavaScriptSerializer().Serialize(request);

ผลลัพธ์จะเป็นดังนี้:

json = "{\"registration_ids\":[\"id1\",\"id2\"],\"data\":{\"message\":\"Your message\",\"tickerText\":\"Your ticket\",\"contentTitle\":\"Your content\"}}"

หวังว่ามันจะช่วย!


5

หากคุณไม่สามารถหรือไม่ต้องการใช้ JSON serializers ในตัวสองตัว ( JavaScriptSerializerและDataContractJsonSerializer ) คุณสามารถลองใช้ห้องสมุดJsonExSerializer - ฉันใช้มันในโครงการหลายโครงการและทำงานได้ค่อนข้างดี


1
ฉันลองใช้ JavaScriptSerializer แล้ว แต่มันไม่สามารถใช้งานได้กับวัตถุที่ไม่มีค่า
Luke101

1
@ Luke101: ว่าอย่างไร ฉันหมายถึงฉันใช้มันทุกวันและไม่เคยมีปัญหาดังนั้นฉันอยากรู้อยากเห็นอย่างจริงใจ! (ไม่เหน็บแนมฉันอยากรู้อยากเห็นจริง ๆ เพราะฉันไม่เคยพบปัญหา)
Tamas Czinege

2

หากคุณกำลังพยายามสร้างบริการเว็บเพื่อให้บริการข้อมูลผ่าน JSON ไปยังหน้าเว็บให้พิจารณาใช้ชุดเครื่องมือ ASP.NET Ajax:

http://www.asp.net/learn/ajax/tutorial-05-cs.aspx

มันจะแปลงวัตถุของคุณที่ให้บริการผ่านเว็บเซอร์เป็น json โดยอัตโนมัติและสร้างคลาสพร็อกซีที่คุณสามารถใช้เชื่อมต่อกับมัน


มันจะเป็นการเรียกไปยัง .ashx ที่จะส่งคืนสตริงของ JSON ก่อนอื่นฉันแค่พยายามหาวิธีสร้างสตริง .. ใช้ StringBuilder? ประการที่สองใช่วิธีการทำให้เป็นอันดับ เมื่อส่งคืน XML คุณเพียงแค่ตั้งค่าการตอบสนองที่ฉันคิดว่า: context.Response.ContentType = "text / xml"
PositiveGuy

1

DataContractJsonSerializerจะทำทุกอย่างให้คุณแบบเดียวกับที่ง่ายอย่างที่ XMLSerializer มันเป็นเรื่องเล็กน้อยที่จะใช้สิ่งนี้ในเว็บแอป หากคุณใช้ WCF คุณสามารถระบุการใช้กับแอททริบิวต์ได้ ตระกูล DataContractSerializer นั้นเร็วมากเช่นกัน


1

ฉันพบว่าคุณไม่ต้องการ serializer เลย หากคุณส่งคืนวัตถุเป็นรายการ ขอผมใช้ตัวอย่าง

ใน asmx ของเราเรารับข้อมูลโดยใช้ตัวแปรที่เราส่งผ่าน

// return data
[WebMethod(CacheDuration = 180)]
public List<latlon> GetData(int id) 
{
    var data = from p in db.property 
               where p.id == id 
               select new latlon
               {
                   lat = p.lat,
                   lon = p.lon

               };
    return data.ToList();
}

public class latlon
{
    public string lat { get; set; }
    public string lon { get; set; }
}

จากนั้นใช้ jquery ที่เราเข้าถึงบริการผ่านตัวแปรนั้น

// get latlon
function getlatlon(propertyid) {
var mydata;

$.ajax({
    url: "getData.asmx/GetLatLon",
    type: "POST",
    data: "{'id': '" + propertyid + "'}",
    async: false,
    contentType: "application/json;",
    dataType: "json",
    success: function (data, textStatus, jqXHR) { //
        mydata = data;
    },
    error: function (xmlHttpRequest, textStatus, errorThrown) {
        console.log(xmlHttpRequest.responseText);
        console.log(textStatus);
        console.log(errorThrown);
    }
});
return mydata;
}

// call the function with your data
latlondata = getlatlon(id);

และเราได้รับคำตอบจากเรา

{"d":[{"__type":"MapData+latlon","lat":"40.7031420","lon":"-80.6047970}]}

url: "getData.asmx / GetLatLon" ตามที่ฉันคาดหวังเมธอด GetLatLon ในโค้ดฝั่งเซิร์ฟเวอร์ของคุณ แต่ไม่มี
Lali

1

การใช้การเข้ารหัส

วัตถุอย่างง่ายเพื่อ JSON Array EncodeJsObjectArray ()

public class dummyObject
{
    public string fake { get; set; }
    public int id { get; set; }

    public dummyObject()
    {
        fake = "dummy";
        id = 5;
    }

    public override string ToString()
    {
        StringBuilder sb = new StringBuilder();
        sb.Append('[');
        sb.Append(id);
        sb.Append(',');
        sb.Append(JSONEncoders.EncodeJsString(fake));
        sb.Append(']');

        return sb.ToString();
    }
}

dummyObject[] dummys = new dummyObject[2];
dummys[0] = new dummyObject();
dummys[1] = new dummyObject();

dummys[0].fake = "mike";
dummys[0].id = 29;

string result = JSONEncoders.EncodeJsObjectArray(dummys);

ผลลัพธ์: [[29, "mike"], [5, "dummy"]]

การใช้งานสวย

พริ้นต์วิธี JSON Array PrettyPrintJson () ส่วนขยายสตริง

string input = "[14,4,[14,\"data\"],[[5,\"10.186.122.15\"],[6,\"10.186.122.16\"]]]";
string result = input.PrettyPrintJson();

ผลลัพธ์คือ:

[
   14,
   4,
   [
      14,
      "data"
   ],
   [
      [
         5,
         "10.186.122.15"
      ],
      [
         6,
         "10.186.122.16"
      ]
   ]
]
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.