Come creare una stringa JSON in C #


238

Ho appena usato XmlWriter per creare alcuni XML da inviare in risposta HTTP. Come vorresti creare una stringa JSON. Suppongo che useresti semplicemente un costruttore di stringhe per creare la stringa JSON e formattare la tua risposta come JSON?


Controlla questi 3 modi per convertire i dati in stringa JSON in Asp.net C # codepedia.info/2015/07/…
Satinder singh

Risposte:


249

È possibile utilizzare la classe JavaScriptSerializer , consultare questo articolo per creare un metodo di estensione utile.

Codice dall'articolo:

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

Uso:

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

sì, sto solo cercando di capire come formare prima il testo JSON. Grazie
Positivo

cosa succede se non si utilizza .NET 3.5! da ** it
Positive

2
JavaScriptSerializer fa parte di ASP.NET Ajax 1.0 se si desidera utilizzarlo da .NET 2.0.
Joe Chung,

2
Puoi ancora usarlo. Fa
Naren,

il nostro progetto può essere aperto in VS 2008 ... quindi è stato convertito ad un certo punto. Ciò significa che ora possiamo usare .NET 3.5 all'interno della nostra base di codice esistente?
Positivo

366

L'uso di Newtonsoft.Json lo rende davvero più semplice:

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

Documentazione: serializzazione e deserializzazione di JSON


8
MS ora fornisce NewtonSoft come standard nel modello del progetto VS MVC4
Chris F Carroll,

45
È inoltre possibile serializzare oggetti anonimi quando necessario: string json = JsonConvert.SerializeObject(new { "PropertyA" = obj.PropertyA });.
Matt Beckman,

9
@MattBeckman Ottengo "Dichiaratore membro di tipo anonimo non valido. I membri di tipo anonimo devono essere dichiarati con assegnazione di un membro, nome semplice o accesso al membro. Non dovrebbe "PropertyA"essere PropertyA?
Giona

Quindi abbiamo bisogno di implementare una classe e oggetti, per costruire un semplice json! Immagina elementi nidificati - non fissi -. Non riesco a capire perché così tanto entusiasmo nell'aria!
Vassilis,

6
@MattBeckman @Jonah è string json = JsonConvert.SerializeObject(new { PropertyA = obj.PropertyA });senza virgolette doppiePropertyA.
Jose

18

Questa libreria è molto utile per JSON di C #

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


1
Permettetemi di chiedervi, quali sono i vantaggi dell'utilizzo di questo framework rispetto al solo metodo di supporto menzionato in precedenza da CMS?
Positivo

1
consente una granularità più fine rispetto al json, ad esempio è possibile specificare di includere
valori

17

Utilizzo semplice delle librerie Newtonsoft.Json e 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"]);

Semplice e maneggevole. Grazie.
QMaster il

13

Questo frammento di codice utilizza DataContractJsonSerializer di System.Runtime.Serialization.Json in .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
Quindi ... decommenta il riferimento "this" per far funzionare effettivamente questo snippet. Se non hai mai lavorato con metodi di estensione prima, questo potrebbe non essere ovvio.
Dan Esparza,

7

Dai un'occhiata a http://www.codeplex.com/json/ per il progetto json-net.aspx. Perché reinventare la ruota?


3
dipende, potrei non voler fare affidamento su un plug-in open source di terze parti solo per creare JSON. Preferirei creare personalmente il metodo string / helper.
Positivo

7

Puoi anche provare il mio ServiceStack JsonSerializer al momento è il serializzatore JSON .NET più veloce . Supporta la serializzazione di DataContracts, qualsiasi tipo di POCO, interfacce, oggetti associati in ritardo inclusi tipi anonimi, ecc.

Esempio di base

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

Nota: utilizzare il JavaScriptSerializer di Microsoft solo se le prestazioni non sono importanti per te poiché ho dovuto lasciarle fuori dai miei benchmark poiché è fino a 40x-100x più lenta degli altri serializzatori JSON.


Ho provato JsonSerializer.SerializeToString con un elenco di oggetti e ho appena restituito json vuoto: "[{}, {}]" pastebin.com/yEw57L3T Ecco come appare il mio oggetto prima di chiamare SerializeToString i.imgur.com/dYIE7J1.png La risposta più votata qui ha funzionato però, restituendo quello che mi aspettavo: pastebin.com/aAtB3Gxu
Matthew Lock,

il collegamento più veloce al serializzatore .NET JSON è morto.

6

Se hai bisogno di risultati complessi (integrati) crea la tua struttura:

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

e quindi è possibile ottenere la stringa JSON con la chiamata

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

Il risultato sarà così:

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

Spero che sia d'aiuto!


5

Se non puoi o non vuoi usare i due serializzatori JSON integrati ( JavaScriptSerializer e DataContractJsonSerializer ) puoi provare la libreria JsonExSerializer : la utilizzo in numerosi progetti e funziona abbastanza bene.


1
ho provato JavaScriptSerializer e non funziona bene con oggetti null.
Luke101,

1
@ Luke101: come esattamente? Voglio dire, lo uso tutti i giorni e non ho mai avuto problemi, quindi sono sinceramente curioso! (nessuna ironia, sono davvero curioso perché non ho mai riscontrato problemi)
Tamas Czinege,

2

Se si sta tentando di creare un servizio Web per pubblicare dati su JSON su una pagina Web, prendere in considerazione l'utilizzo del toolkit Ajax ASP.NET:

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

Converte automaticamente i tuoi oggetti serviti su un servizio web in json e creerà la classe proxy che puoi usare per connetterti ad esso.


sarebbe solo una chiamata a un .ashx che restituirebbe una stringa di JSON. In primo luogo, sto solo cercando di capire come formare la stringa ... usare StringBuilder? In secondo luogo, sì, come serializzare. Quando si restituisce XML, è sufficiente impostare il tipo di contenuto della risposta, penso: context.Response.ContentType = "text / xml"
PositiveGuy

1

Il DataContractJsonSerializer farà di tutto per voi con la stessa facilità come il XMLSerializer. È banale usarlo in un'app Web. Se si utilizza WCF, è possibile specificarne l'utilizzo con un attributo. Anche la famiglia DataContractSerializer è molto veloce.


1

Ho scoperto che non è necessario il serializzatore. Se si restituisce l'oggetto come Elenco. Lasciami usare un esempio.

Nel nostro asmx otteniamo i dati usando la variabile che abbiamo passato

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

Quindi usando jquery accediamo al servizio, passando lungo quella variabile.

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

E otteniamo la nostra risposta.

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

url: "getData.asmx / GetLatLon", come mi aspetto dal metodo GetLatLon nel codice lato server. Ma non c'è.
Lali,

1

Codifica utilizzo

Semplice oggetto all'array JSON 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);

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

Uso grazioso

Metodo di estensione della stringa Pretty Print Jray Array PrettyPrintJson ()

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

I risultati sono:

[
   14,
   4,
   [
      14,
      "data"
   ],
   [
      [
         5,
         "10.186.122.15"
      ],
      [
         6,
         "10.186.122.16"
      ]
   ]
]
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.