Cara membuat string JSON di C #

238

Saya hanya menggunakan XmlWriter untuk membuat XML untuk mengirim kembali dalam respons HTTP. Bagaimana Anda membuat string JSON. Saya berasumsi Anda hanya akan menggunakan stringbuilder untuk membangun string JSON dan mereka memformat respons Anda sebagai JSON?

PositiveGuy
sumber
Periksa 3 cara ini untuk mengonversi data ke String JSON di Asp.net C # codepedia.info/2015/07/...
Satinder singh

Jawaban:

249

Anda bisa menggunakan kelas JavaScriptSerializer , periksa artikel ini untuk membangun metode ekstensi yang berguna.

Kode dari artikel:

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

Pemakaian:

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();
CMS
sumber
ya, hanya mencoba mencari cara untuk membentuk teks JSON terlebih dahulu. Terima kasih
PositiveGuy
bagaimana jika Anda tidak menggunakan .NET 3.5! da ** it
PositiveGuy
2
JavaScriptSerializer adalah bagian dari ASP.NET Ajax 1.0 jika Anda ingin menggunakannya dari .NET 2.0.
Joe Chung
2
Anda masih bisa menggunakannya. Bagian dari ASP.NET 2.0 AJAX Extensions 1.0: asp.net/AJAX/Documentation/Live/mref/…
Naren
proyek kami dapat dibuka di VS 2008 ... jadi itu dikonversi di beberapa titik. Apakah itu berarti kita sekarang dapat menggunakan .NET 3.5 dalam basis kode yang ada?
PositiveGuy
366

Menggunakan Newtonsoft.Json membuatnya sangat mudah:

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

Dokumentasi: Melakukan Serialisasi dan Deserialisasi JSON

Orr
sumber
8
MS sekarang mengirimkan NewtonSoft sebagai standar dalam template proyek VS MVC4
Chris F Carroll
45
Anda juga dapat cerita bersambung benda anonim bila diperlukan: string json = JsonConvert.SerializeObject(new { "PropertyA" = obj.PropertyA });.
Matt Beckman
9
@MattBeckman saya mendapatkan "Deklarator anggota tipe anonim tidak valid. Anggota tipe anonim harus dinyatakan dengan tugas anggota, nama sederhana atau akses anggota. Tidak "PropertyA"boleh PropertyA?
Jonah
Jadi kita perlu mengimplementasikan Kelas dan objek, untuk membangun json sederhana! Bayangkan bersarang - array tidak tetap - elemen. Saya tidak bisa melihat mengapa begitu banyak antusiasme di udara!
Vassilis
6
@MattBeckman @Jonah string json = JsonConvert.SerializeObject(new { PropertyA = obj.PropertyA });tanpa tanda kutip ganda padaPropertyA.
Jose
18

Perpustakaan ini sangat baik untuk JSON dari C #

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

Hugoware
sumber
1
Izinkan saya bertanya, apa manfaat menggunakan kerangka kerja ini dibandingkan metode pembantu yang disebutkan CMS di atas?
PositiveGuy
1
memungkinkan Anda rincian lebih halus selama json misalnya Anda dapat menentukan untuk menyertakan nulls atau tidak dll
redsquare
17

Penggunaan simlpe dari Newtonsoft.Json dan Newtonsoft.Json.Linq perpustakaan.

        //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"]);
Dr. K
sumber
Sederhana dan praktis. Terima kasih.
QMaster
13

Cuplikan kode ini menggunakan DataContractJsonSerializer dari System.Runtime.Serialization.Json di .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());
    }
}
Joe Chung
sumber
3
Jadi ... batalkan komentar pada referensi 'ini' untuk benar-benar membuat cuplikan ini berfungsi. Jika Anda belum pernah bekerja dengan metode ekstensi sebelumnya, ini mungkin tidak jelas.
Dan Esparza
7

Lihatlah http://www.codeplex.com/json/ untuk proyek json-net.aspx. Mengapa menemukan kembali roda?

Josh
sumber
3
tergantung, saya mungkin tidak ingin bergantung pada plugin open source pihak ke-3 hanya untuk membuat JSON. Lebih suka membuat metode string / helper sendiri.
PositiveGuy
7

Anda juga dapat mencoba ServiceStack JsonSerializer saya. Ini adalah serializer .NET JSON tercepat saat ini. Ini mendukung serialisasi DataContracts, semua Jenis POCO, Antarmuka, objek Terlambat termasuk jenis anonim, dll.

Contoh dasar

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

Catatan: Hanya gunakan Microsoft JavaScriptSerializer jika kinerjanya tidak penting bagi Anda karena saya harus meninggalkannya dari tolok ukur saya karena itu hingga 40x-100x lebih lambat daripada serialisator JSON lainnya.

mitos
sumber
Saya mencoba JsonSerializer.SerializeToString dengan daftar objek dan baru saja mengembalikan json kosong: "[{}, {}]" pastebin.com/yEw57L3T Inilah yang terlihat seperti objek saya sebelum saya memanggil SerializeToString i.imgur.com/dYIE7J1.png Namun jawaban teratas di sini berfungsi, mengembalikan apa yang saya harapkan: pastebin.com/aAtB3Gxu
Matthew Lock
Tautan serializer .NET JSON tercepat sudah mati.
6

Jika Anda membutuhkan hasil yang rumit (tertanam) buat struktur Anda sendiri:

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

dan kemudian Anda bisa mendapatkan string JSON dengan menelepon

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

Hasilnya akan seperti ini:

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

Semoga ini bisa membantu!

Rubah Halus
sumber
5

Jika Anda tidak dapat atau tidak ingin menggunakan dua serializers JSON bawaan ( JavaScriptSerializer dan DataContractJsonSerializer ), Anda dapat mencoba perpustakaan JsonExSerializer - Saya menggunakannya dalam sejumlah proyek dan bekerja dengan cukup baik.

Tamas Czinege
sumber
1
Saya telah mencoba JavaScriptSerializer dan tidak bekerja dengan baik dengan objek nol.
Luke101
1
@ Luke101: Bagaimana tepatnya? Maksudku, aku menggunakannya setiap hari dan tidak pernah punya masalah, jadi aku benar-benar penasaran! (tanpa ironi, saya benar-benar ingin tahu karena saya tidak pernah mengalami masalah)
Tamas Czinege
2

Jika Anda mencoba membuat layanan web untuk menyajikan data melalui JSON ke halaman web, pertimbangkan untuk menggunakan ASP.NET Ajax toolkit:

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

Ini akan secara otomatis mengonversi objek Anda yang dilayani melalui layanan web ke json, dan membuat kelas proxy yang dapat Anda gunakan untuk menghubungkannya.

Eduardo Scoz
sumber
itu hanya akan menjadi panggilan ke .ashx yang akan mengembalikan string JSON. Pertama, saya hanya mencoba mencari cara untuk membentuk string..menggunakan StringBuilder? Kedua, ya, bagaimana membuat cerita bersambung. Ketika mengembalikan XML Anda hanya akan mengatur tipe tanggapan ini, saya pikir: context.Response.ContentType = "text / xml"
PositiveGuy
1

The DataContractJsonSerializer akan melakukan semuanya untuk Anda dengan mudah sama seperti XMLSerializer tersebut. Sepele untuk menggunakannya di aplikasi web. Jika Anda menggunakan WCF, Anda bisa menentukan penggunaannya dengan atribut. Keluarga DataContractSerializer juga sangat cepat.

Steve
sumber
1

Saya telah menemukan bahwa Anda tidak memerlukan serializer sama sekali. Jika Anda mengembalikan objek sebagai Daftar. Biarkan saya menggunakan contoh.

Dalam asmx kami, kami mendapatkan data menggunakan variabel yang kami lewati

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

Kemudian menggunakan jquery kita mengakses layanan, meneruskan variabel itu.

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

Dan kami mendapat tanggapan.

{"d":[{"__type":"MapData+latlon","lat":"40.7031420","lon":"-80.6047970}]}
Terus mata
sumber
url: "getData.asmx / GetLatLon", seperti yang saya harapkan metode GetLatLon dalam kode sisi server Anda. Tetapi tidak ada.
Lali
1

Encode Penggunaan

Objek sederhana ke 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);

Hasil: [[29, "mike"], [5, "dummy"]]

Penggunaan Cantik

Cukup cetak JSON Array PrettyPrintJson () metode ekstensi string

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

Hasil adalah:

[
   14,
   4,
   [
      14,
      "data"
   ],
   [
      [
         5,
         "10.186.122.15"
      ],
      [
         6,
         "10.186.122.16"
      ]
   ]
]
Sudhakar Rao
sumber