Cómo crear una cadena JSON en C #

238

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?

PositivoGuy
fuente
Verifique estas 3 formas de convertir datos a cadenas JSON en Asp.net C # codepedia.info/2015/07/…
Satinder singh

Respuestas:

249

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();
CMS
fuente
sí, solo trato de descubrir cómo formar primero el texto JSON. Gracias
PositiveGuy
¡Qué pasa si no estás usando .NET 3.5! da ** it
PositiveGuy
2
JavaScriptSerializer es parte de ASP.NET Ajax 1.0 si desea usarlo desde .NET 2.0.
Joe Chung
2
Aún puedes usarlo. Forma
Naren
nuestro proyecto puede abrirse en VS 2008 ... por lo que se convirtió en algún momento. ¿Eso significa que ahora podemos usar .NET 3.5 dentro de nuestra base de código existente?
PositiveGuy
366

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

Orr
fuente
8
MS ahora envía NewtonSoft como estándar en la plantilla de proyecto VS MVC4
Chris F Carroll
45
También puede serializar objetos anónimos cuando sea necesario: string json = JsonConvert.SerializeObject(new { "PropertyA" = obj.PropertyA });.
Matt Beckman
99
@MattBeckman Me sale "Declarador de miembro de tipo anónimo no válido. Los miembros de tipo anónimo deben declararse con una asignación de miembro, nombre simple o acceso de miembro. ¿No debería "PropertyA"serlo PropertyA?
Jonás
¡Entonces necesitamos implementar una Clase y objetos, para construir un simple json! Imagine elementos anidados, no arreglos fijos. ¡No puedo ver por qué tanto entusiasmo en el aire!
Vassilis
66
@MattBeckman @Jonah no tiene string json = JsonConvert.SerializeObject(new { PropertyA = obj.PropertyA });comillas doblesPropertyA.
Jose
18

Esta biblioteca es muy buena para JSON desde C #

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

Hugoware
fuente
1
Permítanme preguntar, ¿cuáles son los beneficios de usar este marco en comparación con ese método auxiliar que CMS mencionó anteriormente?
PositiveGuy
1
le permite una granularidad más fina sobre el json, por ejemplo, puede especificar que se incluyan nulos o no, etc.
redsquare
17

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"]);
Dr. K
fuente
Simple y manejable. Gracias.
QMaster
13

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());
    }
}
Joe Chung
fuente
3
Entonces ... descomente la referencia 'this' para que este fragmento funcione realmente. Si no ha trabajado con métodos de extensión antes, esto podría no ser obvio.
Dan Esparza
7

Eche un vistazo a http://www.codeplex.com/json/ para el proyecto json-net.aspx. ¿Por qué reinventar la rueda?

Josh
fuente
3
depende, es posible que no quiera confiar en un complemento de código abierto de terceros solo para crear JSON. Prefiero crear el método string / helper yo mismo.
PositiveGuy
7

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.

mythz
fuente
Intenté JsonSerializer.SerializeToString con una lista de objetos y simplemente devolvió json vacío: "[{}, {}]" pastebin.com/yEw57L3T Esto es lo que parece mi objeto antes de llamar a SerializeToString i.imgur.com/dYIE7J1.png Sin embargo, la respuesta más votada aquí funcionó, devolviendo lo que esperaba: pastebin.com/aAtB3Gxu
Matthew Lock
el enlace de serializador .NET JSON más rápido está muerto.
6

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!

Zorro sutil
fuente
5

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.

Tamas Czinege
fuente
1
He probado el JavaScriptSerializer y no funciona bien con objetos nulos.
Luke101
1
@ Luke101: ¿Cómo exactamente? Quiero decir que lo uso todos los días y nunca tuve problemas, ¡así que sinceramente tengo curiosidad! (sin ironía, tengo mucha curiosidad porque nunca he tenido problemas)
Tamas Czinege
2

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.

Eduardo Scoz
fuente
solo sería una llamada a un .ashx que devolvería una cadena de JSON. Primero, solo estoy tratando de descubrir cómo formar la cadena ... ¿usar un StringBuilder? Segundo, sí, cómo serializar. Cuando devuelva XML, debe configurar el tipo de contenido de la respuesta, creo: context.Response.ContentType = "text / xml"
PositiveGuy
1

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.

Steve
fuente
1

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}]}
Presciente
fuente
url: "getData.asmx / GetLatLon", ya que espero el método GetLatLon en el código del lado del servidor. Pero no hay.
Lali
1

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"
      ]
   ]
]
Sudhakar Rao
fuente