Asegúrese de que el objeto al que intenta convertir tiene un constructor predeterminado (vacío).
Regla de oro: si desea deserializar un objeto, debe simplificar la creación de los objetos.Estas pautas pueden ayudar:
Este JSON cadena/objeto por ejemplo:
{ Name: "John Doe", Phone: "123-456-7890", Pets: [ "dog", "cat", "snake" ] }
se puede convertir a un objeto de la clase siguiente:
public class Person {
public string Name { get; set; }
public string Phone { get; set; }
public string[] Pets { get; set; }
}
o ésta:
public class Person {
public string Name { get; set; }
public string Phone { get; set; }
public string[] Pets { get; set; }
public Person() {}
public Person(string name, string phone) {
Name = name;
Phone = phone;
}
}
o este:
public class Person {
public string Name { get; set; }
public string Phone { get; set; }
public string[] Pets { get; set; }
public Person() {}
}
pero no esta
public class Person {
public string Name { get; set; }
public string Phone { get; set; }
public string[] Pets { get; set; }
public Person(string name, string phone) {
Name = name;
Phone = phone;
}
}
Ahora vamos a ASP.NET MVC 4 del resto
public class PersonController : ApiController
{
// .. other actions
public HttpResponseMessage PostPerson(Person person)
{
if (null != person)
// CELEBRATE by doing something with your object
else
// BE SAD and throw and exception or pass an error message
}
// .. other actions
}
Si su clase no puede tener un constructor por defecto o si no tiene acceso al código fuente de la clase, puede crear una clase de adaptador que
- tiene un constructor por defecto
- expone aquellas propiedades que deben ser públicos
Utilización de la clase Persona anterior con ningún constructor por defecto, un adaptador podría parecerse a
public class PersonAdapter {
public Person personAdaptee;
public string Name {
get { return personAdaptee.Name; }
set { personAdaptee.Name = value }
}
public string Phone {
get { return personModel.Phone; }
set { personModel.Phone = value; }
}
public string[] Pets {
get { return personAdaptee.Pets; }
set {personAdaptee.Pets = value }
}
public PersonAdapter() {
personAdaptee = new Person("", "", null);
}
}
Ahora vamos a ASP.NET MVC 4 hacer el resto
public class PersonController : ApiController
{
// .. other actions
public HttpResponseMessage PostPerson(PersonAdapter person)
{
if (null != person)
// CELEBRATE by doing something with your object
else
// BE SAD and throw and exception or pass an error message
}
// .. other actions
}
No puedo entender cómo sabe qué acción estamos tratando de llamar? En este controlador podemos tener cientos de ellos. – webdeveloper
Es RESTful y convencional. Está utilizando verbo POST en su solicitud de jQuery => se invoca la acción de publicación. Si utilizó el verbo 'GET' (por ejemplo, escribir el nombre de la acción directamente en la barra de direcciones de su navegador) => se habría invocado la acción Obtener. Entonces no puedes tener cientos de ellos. Los verbos HTTP estándar son 'GET',' POST', 'PUT' y' DELETE', por lo que esos son los nombres de las acciones que deberías estar usando. Por supuesto, siempre puede violar las convenciones RESTful estándar => continuar y modificar las rutas en su archivo '~/App_Start/WebApiConfig.cs' para que incluya el nombre de la acción en la url. –
Me pregunto cuál es la diferencia entre los datos: JSON.stringify ({title: "fghfdhgfdgfd"}), y data: '{Title: "fghfdhgfdgfd"}', que terminé usando? – user1615362