C # JSON dizesi oluşturma


238

Ben sadece bir HTTP yanıtı geri göndermek için bazı XML oluşturmak için XmlWriter kullandım. Nasıl JSON dizesi yaratırsınız? Sadece JSON dizesini oluşturmak için bir stringbuilder kullanacağınızı ve yanıtınızı JSON olarak biçimlendireceğinizi varsayıyorum?


Asp.net C # JSped
Satinder singh

Yanıtlar:


249

Sen kullanabilirsiniz JavaScriptSerializer sınıfını kontrol Bu makaleyi yararlı bir uzantısı yöntemi oluşturmak için.

Makalenin kodu:

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

Kullanımı:

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

Evet, sadece önce JSON metninin nasıl oluşturulacağını anlamaya çalışıyorum. Teşekkürler
PositiveGuy

.NET 3.5 kullanmıyorsanız ne olacak? da ** it
PositiveGuy

2
.NET 2.0'dan kullanmak istiyorsanız JavaScriptSerializer, ASP.NET Ajax 1.0'ın bir parçasıdır.
Joe Chung

2
Yine de kullanabilirsiniz. ASP.NET 2.0 AJAX Uzantıları 1.0'ın bir parçası: asp.net/AJAX/Documentation/Live/mref/…
Naren

projemiz VS 2008'de açılabilir ... bu yüzden bir noktada dönüştürüldü. Bu, mevcut kod tabanımızda .NET 3.5'i kullanabileceğimiz anlamına mı geliyor?
PositiveGuy

366

Newtonsoft.Json kullanmak gerçekten daha kolay:

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

Belgeler: JSON'un Serileştirilmesi ve Dizinin Kaldırılması


8
MS şimdi VS MVC4 proje şablonunda standart olarak NewtonSoft'u gönderiyor
Chris F Carroll

45
Gerektiğinde Ayrıca anonim nesneleri seri edebilirsiniz: string json = JsonConvert.SerializeObject(new { "PropertyA" = obj.PropertyA });.
Matt Beckman

9
. Ben "olsun @MattBeckman Geçersiz anonim tipi üyesi Bildiricisi Anonim tipi üyeleri üye ataması, basit adı veya üye erişimi ile beyan edilmesi gerekir gerekmiyor. "PropertyA"Olmak PropertyA?
Jonah

Bu yüzden basit bir json oluşturmak için bir Sınıf ve nesneler uygulamalıyız! İç içe - sabit diziler değil - öğeleri hayal edin. Havada neden bu kadar coşku olduğunu anlayamıyorum!
Vassilis

6
@MattBeckman @Jonah string json = JsonConvert.SerializeObject(new { PropertyA = obj.PropertyA });çift ​​tırnak işaretleri olmadanPropertyA.
Jose


17

Ait Simlpe kullanımı Newtonsoft.Json ve Newtonsoft.Json.Linq kütüphaneler.

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

Basit ve kullanışlı. Teşekkürler.
QMaster

13

Bu kod pasajı, .NET 3.5'te System.Runtime.Serialization.Json'dan DataContractJsonSerializer'ı kullanır.

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
Bu yüzden ... bu pasajı gerçekten çalıştırmak için 'bu' referansın açıklamasını kaldırın. Daha önce uzantı yöntemleriyle çalışmadıysanız, bu açık olmayabilir.
Dan Esparza

7

Bir göz atın http://www.codeplex.com/json/ json-net.aspx proje için. Neden tekerleği yeniden icat etti?


3
bağlıdır, ben sadece JSON oluşturmak için bir üçüncü taraf açık kaynak eklentisine güvenmek istemeyebilirim. Dize / yardımcı yöntemi kendim oluşturmayı tercih ederim.
PositiveGuy

7

Ayrıca benim ServiceStack deneyebilirsiniz JsonSerializer öyle hızlı .NET JSON seri hale anda. DataContracts serisini, herhangi bir POCO Tipini, Arayüzleri, anonim tipler dahil geç bağlı nesneleri vb.

Temel Örnek

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

Not: Microsofts JavaScriptSerializer'ı yalnızca performans sizin için önemli değilse kullanın, çünkü diğer JSON serileştiricilerinden 40x-100x'e kadar daha yavaş olduğu için testlerimden ayrılmak zorunda kaldım .


Ben bir nesne listesi ile JsonSerializer.SerializeToString denedim ve sadece boş json döndü: "[{}, {}]" pastebin.com/yEw57L3T SerializeToString i.imgur.com/dYIE7J1.png çağırmadan önce benim nesne böyle görünüyor Buradaki en çok oy alan cevap, beklediğim şeyi döndürerek yine de çalıştı: pastebin.com/aAtB3Gxu
Matthew Lock

en hızlı .NET JSON serileştirici bağlantısı öldü.

6

Karmaşık sonuca (gömülü) ihtiyacınız varsa kendi yapınızı oluşturun:

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

ve sonra çağrı ile JSON dizesi elde edebilirsiniz

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

Sonuç şöyle olacaktır:

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

Umarım yardımcı olur!


5

İki yerleşik JSON serileştiricisini ( JavaScriptSerializer ve DataContractJsonSerializer ) kullanmak istemiyorsanız veya istemiyorsanız , JsonExSerializer kitaplığını deneyebilirsiniz - bunu bir dizi projede kullanıyorum ve oldukça iyi çalışıyor.


1
JavaScriptSerializer denedim ve null nesnelerle iyi çalışmıyor.
Luke101

1
@ Luke101: Tam olarak nasıl? Yani her gün kullanıyorum ve hiç problem yaşamadım, bu yüzden dürüst merak ediyorum! (ironi yok, gerçekten merak ediyorum çünkü hiç problemle karşılaşmadım)
Tamas Czinege

2

JSON üzerinden bir web sayfasına veri sunmak için bir web hizmeti oluşturmaya çalışıyorsanız, ASP.NET Ajax araç takımını kullanmayı düşünün:

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

Bir web hizmeti üzerinden sunulan nesnelerinizi otomatik olarak json'a dönüştürür ve ona bağlanmak için kullanabileceğiniz proxy sınıfını oluşturur.


sadece bir JSON dizesi döndürecek bir .ashx çağrısı olurdu. İlk olarak, sadece string oluşturmak nasıl anlamaya çalışıyorum .. Bir StringBuilder kullanın? İkincisi, evet, nasıl serileştirilir. XML döndürürken sadece yanıtın içerik türünü ayarlayacağınızı düşünüyorum: context.Response.ContentType = "text / xml"
PositiveGuy

1

DataContractJSONSerializer XmlSerializer'ı aynı kolay olan sizin için her şeyi yapacağız. Bunu bir web uygulamasında kullanmak önemsizdir. WCF kullanıyorsanız, kullanımını bir öznitelikle belirtebilirsiniz. DataContractSerializer ailesi de çok hızlı.


1

Serileştiriciye hiç ihtiyacınız olmadığını buldum. Nesneyi bir Liste olarak döndürürseniz. Bir örnek vereyim.

Asmx'imizde verileri geçtiğimiz değişkeni kullanarak alıyoruz

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

Sonra jquery kullanarak bu değişken üzerinden geçen hizmet erişir.

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

Ve cevabımızı alıyoruz.

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

url: "getData.asmx / GetLatLon", sunucu tarafı kodunuzda GetLatLon yöntemini beklediğim gibi. Ama yok.
Lali

1

Kodlama Kullanımı

JSON Array EncodeJsObjectArray () öğesine basit nesne

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

Sonuç: [[29, "mike"], [5, "kukla"]]

Güzel Kullanım

Güzel baskı JSON Array PrettyPrintJson () dize uzantısı yöntemi

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

Sonuçlar:

[
   14,
   4,
   [
      14,
      "data"
   ],
   [
      [
         5,
         "10.186.122.15"
      ],
      [
         6,
         "10.186.122.16"
      ]
   ]
]
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.