¿Cómo puedo convertir un objeto JSON en un objeto C# personalizado?
¿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; }
}
É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);
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);
}
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;
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 JavascriptSerializer
clase 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);