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?
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?
Risposte:
È 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();
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
string json = JsonConvert.SerializeObject(new { "PropertyA" = obj.PropertyA });
.
"PropertyA"
essere PropertyA
?
string json = JsonConvert.SerializeObject(new { PropertyA = obj.PropertyA });
senza virgolette doppiePropertyA.
Questa libreria è molto utile per JSON di C #
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"]);
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());
}
}
Dai un'occhiata a http://www.codeplex.com/json/ per il progetto json-net.aspx. Perché reinventare la ruota?
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.
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!
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.
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.
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.
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}]}
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"
]
]
]