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?


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

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


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


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

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

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?


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.


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!


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.


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.


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.


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

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"
      ]
   ]
]
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.