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?
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();
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
Cette bibliothèque est très bonne pour JSON à partir de C #
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());
}
}
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.
Jetez un œil à http://www.codeplex.com/json/ pour le projet json-net.aspx. Pourquoi réinventer la roue?
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!
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.
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"]);
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.
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"
]
]
]
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}]}
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.