Comment créer une chaîne JSON en C #

238

Je viens d'utiliser le XmlWriter pour créer du XML à renvoyer dans une réponse HTTP. Comment créeriez-vous une chaîne JSON. Je suppose que vous utiliseriez simplement un constructeur de chaînes pour créer la chaîne JSON et les formater votre réponse en JSON?

PositiveGuy
la source
Vérifiez ces 3 façons de convertir les données en chaîne JSON dans Asp.net C # codepedia.info/2015/07/…
Satinder singh

Réponses:

249

Vous pouvez utiliser la classe JavaScriptSerializer , consultez cet article pour créer une méthode d'extension utile.

Code de l'article:

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

Usage:

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
la source
oui, juste essayer de comprendre comment former le texte JSON en premier. Merci
PositiveGuy
que faire si vous n'utilisez pas .NET 3.5! da ** it
PositiveGuy
2
JavaScriptSerializer fait partie d'ASP.NET Ajax 1.0 si vous souhaitez l'utiliser à partir de .NET 2.0.
Joe Chung
2
Vous pouvez toujours l'utiliser. Sa partie des extensions AJAX ASP.NET 2.0 1.0: asp.net/AJAX/Documentation/Live/mref/…
Naren
notre projet peut s'ouvrir dans VS 2008 ... il a donc été converti à un moment donné. Cela signifie-t-il que nous pouvons maintenant utiliser .NET 3.5 dans notre base de code existante?
PositiveGuy
366

L'utilisation de Newtonsoft.Json facilite vraiment les choses:

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

Documentation: Sérialisation et désérialisation JSON

Orr
la source
8
MS expédie désormais NewtonSoft en standard dans le modèle de projet VS MVC4
Chris F Carroll
45
Vous pouvez également sérialisation des objets anonymes en cas de besoin: string json = JsonConvert.SerializeObject(new { "PropertyA" = obj.PropertyA });.
Matt Beckman
9
@MattBeckman J'obtiens "Déclarateur de membre de type anonyme non valide. Les membres de type anonyme doivent être déclarés avec une affectation de membre, un nom simple ou un accès membre. Ne devrait pas l' "PropertyA"être PropertyA?
Jonah
Nous devons donc implémenter une classe et des objets, pour construire un simple json! Imaginez des éléments imbriqués et non fixes. Je ne vois pas pourquoi tant d'enthousiasme dans l'air!
Vassilis
6
@MattBeckman @Jonah est string json = JsonConvert.SerializeObject(new { PropertyA = obj.PropertyA });sans guillemets lePropertyA.
Jose
18

Cette bibliothèque est très bonne pour JSON de C #

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

Hugoware
la source
1
Permettez-moi de vous demander quels sont les avantages d'utiliser ce cadre par rapport à cette méthode d'assistance que CMS a mentionnée ci-dessus.
PositiveGuy
1
vous permet une granularité plus fine sur le json, par exemple, vous pouvez spécifier d'inclure les
valeurs
17

Utilisation simlpe des bibliothèques Newtonsoft.Json et 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"]);
Dr. K
la source
Simple et maniable. Merci.
QMaster
13

Cet extrait de code utilise le DataContractJsonSerializer de System.Runtime.Serialization.Json dans .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
la source
3
Donc ... décommentez la référence "this" pour que cet extrait fonctionne. Si vous n'avez jamais travaillé avec des méthodes d'extension auparavant, cela peut ne pas être évident.
Dan Esparza
7

Jetez un œil à http://www.codeplex.com/json/ pour le projet json-net.aspx. Pourquoi réinventer la roue?

Josh
la source
3
dépend, je ne veux pas compter sur un plugin open source tiers juste pour créer JSON. Je préfère créer moi-même la méthode string / helper.
PositiveGuy
7

Vous pouvez également essayer mon ServiceStack JsonSerializer, c'est le sérialiseur .NET JSON le plus rapide du moment. Il prend en charge la sérialisation de DataContracts, tout type POCO, interfaces, objets à liaison tardive, y compris les types anonymes, etc.

Exemple de base

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

Remarque: N'utilisez Microsofts JavaScriptSerializer que si les performances ne sont pas importantes pour vous car j'ai dû les laisser hors de mes repères car elles sont jusqu'à 40x-100x plus lentes que les autres sérialiseurs JSON.

mythz
la source
J'ai essayé JsonSerializer.SerializeToString avec une liste d'objets et il a juste retourné json vide: "[{}, {}]" pastebin.com/yEw57L3T Voici à quoi ressemble mon objet avant d'appeler SerializeToString i.imgur.com/dYIE7J1.png La réponse la plus votée ici a fonctionné, renvoyant ce que j'attendais: pastebin.com/aAtB3Gxu
Matthew Lock
le lien sérialiseur .NET JSON le plus rapide est mort.
6

Si vous avez besoin d'un résultat complexe (intégré), créez votre propre structure:

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

puis vous pouvez obtenir une chaîne JSON avec appel

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

Le résultat sera comme ceci:

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

J'espère que ça aide!

Renard subtil
la source
5

Si vous ne pouvez pas ou ne voulez pas utiliser les deux sérialiseurs JSON intégrés ( JavaScriptSerializer et DataContractJsonSerializer ), vous pouvez essayer la bibliothèque JsonExSerializer - je l'utilise dans un certain nombre de projets et fonctionne très bien.

Tamas Czinege
la source
1
j'ai essayé le JavaScriptSerializer et cela ne fonctionne pas bien avec des objets nuls.
Luke101
1
@ Luke101: Comment exactement? Je veux dire que je l'utilise tous les jours et que je n'ai jamais eu de problèmes, donc je suis honnêtement curieux! (pas d'ironie, je suis vraiment curieux car je n'ai jamais rencontré de problème)
Tamas Czinege
2

Si vous essayez de créer un service Web pour diffuser des données via JSON sur une page Web, envisagez d'utiliser la boîte à outils ASP.NET Ajax:

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

Il convertira automatiquement vos objets servis sur un service Web en json et créera la classe proxy que vous pouvez utiliser pour vous y connecter.

Eduardo Scoz
la source
ce serait juste un appel à un .ashx qui retournerait une chaîne de JSON. Tout d'abord, j'essaie juste de comprendre comment former la chaîne ... utilisez un StringBuilder? Ensuite, oui, comment sérialiser. Lors du retour de XML, vous devez simplement définir le type de contenu de la réponse, je pense: context.Response.ContentType = "text / xml"
PositiveGuy
1

Le DataContractJSONSerializer fera tout pour vous avec la même facilité que le XMLSerializer. Son trivial pour l'utiliser dans une application web. Si vous utilisez WCF, vous pouvez spécifier son utilisation avec un attribut. La famille DataContractSerializer est également très rapide.

Steve
la source
1

J'ai trouvé que vous n'avez pas du tout besoin du sérialiseur. Si vous renvoyez l'objet sous forme de liste. Permettez-moi d'utiliser un exemple.

Dans notre asmx, nous obtenons les données en utilisant la variable que nous avons transmise

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

Ensuite, en utilisant jquery, nous accédons au service en transmettant cette variable.

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

Et nous obtenons notre réponse.

{"d":[{"__type":"MapData+latlon","lat":"40.7031420","lon":"-80.6047970}]}
Prescient
la source
url: "getData.asmx / GetLatLon", comme j'attends la méthode GetLatLon dans votre code côté serveur. Mais il n'y a pas.
Lali
1

Encoder l'utilisation

Objet simple à 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);

Résultat: [[29, "mike"], [5, "dummy"]]]

Jolie utilisation

Méthode d'impression de chaîne Pretty Print JSON Array PrettyPrintJson ()

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

Les résultats sont:

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