Acabo de usar XmlWriter para crear algo de XML para enviar de vuelta en una respuesta HTTP. ¿Cómo crearías una cadena JSON? ¿Supongo que usaría un generador de cadenas para construir la cadena JSON y formatear su respuesta como JSON?
Acabo de usar XmlWriter para crear algo de XML para enviar de vuelta en una respuesta HTTP. ¿Cómo crearías una cadena JSON? ¿Supongo que usaría un generador de cadenas para construir la cadena JSON y formatear su respuesta como JSON?
Respuestas:
Puede usar la clase JavaScriptSerializer , consulte este artículo para crear un método de extensión útil.
Código del artículo:
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();
Usar Newtonsoft.Json lo hace realmente más fácil:
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);
Documentación: serialización y deserialización de JSON
string json = JsonConvert.SerializeObject(new { "PropertyA" = obj.PropertyA });
.
"PropertyA"
serlo PropertyA
?
string json = JsonConvert.SerializeObject(new { PropertyA = obj.PropertyA });
comillas doblesPropertyA.
Esta biblioteca es muy buena para JSON desde C #
Uso simple de las bibliotecas Newtonsoft.Json y 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"]);
Este fragmento de código utiliza el DataContractJsonSerializer de System.Runtime.Serialization.Json en .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());
}
}
Eche un vistazo a http://www.codeplex.com/json/ para el proyecto json-net.aspx. ¿Por qué reinventar la rueda?
También puede probar mi ServiceStack JsonSerializer , es el serializador .NET JSON más rápido en este momento. Admite serialización de DataContracts, cualquier tipo de POCO, interfaces, objetos enlazados tarde, incluidos los tipos anónimos, etc.
Ejemplo básico
var customer = new Customer { Name="Joe Bloggs", Age=31 };
var json = JsonSerializer.SerializeToString(customer);
var fromJson = JsonSerializer.DeserializeFromString<Customer>(json);
Nota: Solo use Microsofts JavaScriptSerializer si el rendimiento no es importante para usted, ya que tuve que dejarlo fuera de mis puntos de referencia ya que es hasta 40x-100x más lento que los otros serializadores JSON.
Si necesita un resultado complejo (incrustado), cree su propia estructura:
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;
}
};
}
y luego puedes obtener una cadena JSON llamando
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);
El resultado será así:
json = "{\"registration_ids\":[\"id1\",\"id2\"],\"data\":{\"message\":\"Your message\",\"tickerText\":\"Your ticket\",\"contentTitle\":\"Your content\"}}"
¡Espero eso ayude!
Si no puede o no quiere usar los dos serializadores JSON integrados ( JavaScriptSerializer y DataContractJsonSerializer ), puede probar la biblioteca JsonExSerializer ; la uso en varios proyectos y funciona bastante bien.
Si está intentando crear un servicio web para servir datos a través de JSON a una página web, considere usar el kit de herramientas ASP.NET Ajax:
http://www.asp.net/learn/ajax/tutorial-05-cs.aspx
Convertirá automáticamente sus objetos servidos a través de un servicio web a json, y creará la clase de proxy que puede usar para conectarse a él.
El DataContractJsonSerializer hará todo lo posible para usted con la misma fácil ya que el XMLSerializer. Es trivial usar esto en una aplicación web. Si está utilizando WCF, puede especificar su uso con un atributo. La familia DataContractSerializer también es muy rápida.
Descubrí que no necesitas el serializador en absoluto. Si devuelve el objeto como una Lista. Dejame usar un ejemplo.
En nuestro asmx obtenemos los datos usando la variable que pasamos
// 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; }
}
Luego, usando jquery, accedemos al servicio, pasando esa 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);
Y obtenemos nuestra respuesta.
{"d":[{"__type":"MapData+latlon","lat":"40.7031420","lon":"-80.6047970}]}
Codificar el uso
Objeto simple para 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);
Resultado: [[29, "mike"], [5, "dummy"]]
Bastante uso
Pretty print JSON Array PrettyPrintJson () método de extensión de cadena
string input = "[14,4,[14,\"data\"],[[5,\"10.186.122.15\"],[6,\"10.186.122.16\"]]]";
string result = input.PrettyPrintJson();
Los resultados son:
[
14,
4,
[
14,
"data"
],
[
[
5,
"10.186.122.15"
],
[
6,
"10.186.122.16"
]
]
]