¿Cómo puedo convertir un objeto JSON en un objeto C# personalizado?

Resuelto MHop asked hace 14 años • 13 respuestas

¿Existe una manera sencilla de completar mi objeto C# con el objeto JSON pasado a través de AJAX?

Este es el objeto JSON pasado a un método web C# desde la página usando JSON.stringify :

{
    "user": {
        "name": "asdf",
        "teamname": "b",
        "email": "c",
        "players": ["1", "2"]
    }
}

El método web de C# que recibe el objeto JSON:

[WebMethod]
public static void SaveTeam(Object user)
{

}

La clase C# que representa la estructura del objeto JSON pasado al método web.

public class User
{
    public string name { get; set; }
    public string teamname { get; set; }
    public string email { get; set; }
    public Array players { get; set; }
}
MHop avatar Feb 12 '10 01:02 MHop
Aceptado

Éste depende del paquete Newtonsoft NuGet, que es más rápido que el serializador predeterminado.

Si tenemos una clase, podemos usar el siguiente código:

Mycustomclassname oMycustomclassname = Newtonsoft.Json.JsonConvert.DeserializeObject<Mycustomclassname>(jsonString);

si no hay clase, entonces use dinámica:

var oMycustomclassname = Newtonsoft.Json.JsonConvert.DeserializeObject<dynamic>(jsonString);
MSTdev avatar Jan 21 '2015 07:01 MSTdev

Una buena forma de utilizar JSON en C# es con JSON.NET

Inicio rápido y documentación API de JSON.NET: el sitio oficial le ayudará a trabajar con él.

Un ejemplo de cómo usarlo:

public class User
{
    public User(string json)
    {
        JObject jObject = JObject.Parse(json);
        JToken jUser = jObject["user"];
        name = (string) jUser["name"];
        teamname = (string) jUser["teamname"];
        email = (string) jUser["email"];
        players = jUser["players"].ToArray();
    }

    public string name { get; set; }
    public string teamname { get; set; }
    public string email { get; set; }
    public Array players { get; set; }
}

// Use
private void Run()
{
    string json = @"{""user"":{""name"":""asdf"",""teamname"":""b"",""email"":""c"",""players"":[""1"",""2""]}}";
    User user = new User(json);

    Console.WriteLine("Name : " + user.name);
    Console.WriteLine("Teamname : " + user.teamname);
    Console.WriteLine("Email : " + user.email);
    Console.WriteLine("Players:");

    foreach (var player in user.players)
        Console.WriteLine(player);
 }
AndreyAkinshin avatar Feb 11 '2010 18:02 AndreyAkinshin

Para mantener sus opciones abiertas, si está usando .NET 3.5 o posterior, aquí hay un ejemplo resumido que puede usar directamente desde el marco usando Generics. Como otros han mencionado, si no se trata solo de objetos simples, deberías usar JSON.net.

public static string Serialize<T>(T obj)
{
    DataContractJsonSerializer serializer = new DataContractJsonSerializer(obj.GetType());
    MemoryStream ms = new MemoryStream();
    serializer.WriteObject(ms, obj);
    string retVal = Encoding.UTF8.GetString(ms.ToArray());
    return retVal;
}

public static T Deserialize<T>(string json)
{
    T obj = Activator.CreateInstance<T>();
    MemoryStream ms = new MemoryStream(Encoding.Unicode.GetBytes(json));
    DataContractJsonSerializer serializer = new DataContractJsonSerializer(obj.GetType());
    obj = (T)serializer.ReadObject(ms);
    ms.Close();
    return obj;
}

Necesitarás:

using System.Runtime.Serialization;

using System.Runtime.Serialization.Json;
Jammin avatar Feb 11 '2010 18:02 Jammin

Dado su ejemplo de código, no debería necesitar hacer nada más.

Si pasa esa cadena JSON a su método web, analizará automáticamente la cadena JSON y creará un objeto Usuario completo como parámetro para su método SaveTeam.

Sin embargo, en general, puede usar la JavascriptSerializerclase como se muestra a continuación o, para mayor flexibilidad, usar cualquiera de los diversos marcos Json que existen (Jayrock JSON es uno bueno) para una fácil manipulación de JSON.

 JavaScriptSerializer jss= new JavaScriptSerializer();
 User user = jss.Deserialize<User>(jsonResponse); 
womp avatar Feb 11 '2010 18:02 womp