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?


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();

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


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


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"]);

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

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?


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.


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!


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.


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.


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.


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

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"
      ]
   ]
]
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.