web-dev-qa-db-fra.com

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

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

216
PositiveGuy

Vous pouvez utiliser la classe JavaScriptSerializer , cochez la case 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();
240
CMS

Utiliser Newtonsoft.Json le rend vraiment plus facile:

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

344
Orr

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

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

18
Hugoware

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

Vous pouvez également essayer mon ServiceStack JsonSerializer c'est le le plus rapide des sérialisateurs JSON .NET pour le moment. Il prend en charge la sérialisation des contrats de données, tout type de POCO, les interfaces, les 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 JavaScriptSerializer de Microsofts que si les performances ne sont pas importantes pour vous, car je dois le laisser en dehors de mes performances depuis 40x-100x . plus lent que les autres sérialiseurs JSON.

7
mythz

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

7
Josh

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

et alors vous pouvez obtenir une chaîne JSON avec un 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 ça:

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

J'espère que ça aide!

6
Subtle Fox

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

5
Tamas Czinege

Utilisation simple 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"]);
4
Dr. K

Si vous essayez de créer un service Web pour transmettre des données via JSON à une page Web, envisagez d'utiliser le toolkit 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 de proxy que vous pourrez utiliser pour vous y connecter.

2
Eduardo Scoz

Utilisation de l'encodage

Objet simple dans un tableau 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);

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

Jolie utilisation

Méthode d'extension d'extension de chaîne 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"
      ]
   ]
]
1
Sudhakar Rao

J'ai constaté que vous n'avez pas du tout besoin du sérialiseur. Si vous retournez l'objet sous forme de liste. Laissez-moi 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}]}
1
Prescient

Le DataContractJSONSerializer fera tout pour vous avec la même facilité que XMLSerializer. Son trivial d'utiliser cela 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
Steve