una recorrer parse objeto net leer deserializar crear convertir como cadena asp c# asp.net-mvc asp.net-web-api asp.net-core-mvc

recorrer - parse string to json c#



ASP.NET Core MVC: ¿Cómo obtener JSON sin procesar unido a una cadena sin un tipo? (6)

Alternativamente, también podría simplemente aceptar un JObject y usted podría usar Linq para Json ot incluso directamente ToString() si realmente necesita la cadena.

Al igual que en this vieja pregunta sobre las versiones anteriores de ASP.NET, quiero que el cuerpo de la solicitud de un HTTP POST se vincule a una cadena. Parece que el método se une, pero ese value es nulo, cuando ASP.NET invoca mi método de controlador:

namespace Demo.Controllers { [Route("[controller]")] public class WebApiDemoController : Controller { ... // POST api/values [HttpPost] public System.Net.Http.HttpResponseMessage Post([FromBody]string value) { // expected: value = json string, actual: json = null. }

¿Todavía tengo que ir a tomar el cuerpo de una corriente? ¿O debería funcionar esto? Al probar el método anterior, utilicé los siguientes encabezados http:

Accept: Application/json Content-Type: Application/json;charset=UTF-8

Estoy pasando lo siguiente en el cuerpo: { "a": 1 }

NO quiero vincularme a una variable de cadena llamada a. Quiero vincular cualquier JSON que obtenga, y luego quiero usar el contenido JSON, cualquier contenido arbitrario, desde mi método.

Si entendí la documentación, el atributo [FromBody] debería haber hecho lo que quería, pero supongo que el mecanismo de enlace MVC del núcleo ASP.NET no vinculará un json con un "valor de cadena", pero quizás podría hacerlo algo más que me da un nivel equivalente de flexibilidad.

Una pregunta similar here me da la idea de que debería haber escrito [FromBody] dynamic data lugar de usar el [FromBody] string value .

Actualización: Este tipo de truco se debe considerar antes de hacerlo, porque si se quiere que .net core framework maneje la codificación JSON y XML para usted, acaba de matar esa capacidad. Ciertos tipos de servidores REST pueden, y con frecuencia tienen, requisitos para admitir tipos de contenido XML y JSON, al menos los que he encontrado y que tienen documentos estándar.


La opción más limpia que he encontrado es agregar tu propio InputFormatter simple:

public class RawJsonBodyInputFormatter : InputFormatter { public RawJsonBodyInputFormatter() { this.SupportedMediaTypes.Add("application/json"); } public override async Task<InputFormatterResult> ReadRequestBodyAsync(InputFormatterContext context) { var request = context.HttpContext.Request; using (var reader = new StreamReader(request.Body)) { var content = await reader.ReadToEndAsync(); return await InputFormatterResult.SuccessAsync(content); } } protected override bool CanReadType(Type type) { return type == typeof(string); } }

Y en su Startup.cs dentro de ConfigureServices:

services .AddMvc(options => { options.InputFormatters.Insert(0, new RawJsonBodyInputFormatter()); });

Eso le permitirá obtener la carga útil JSON sin procesar en sus controladores:

[HttpPost] public IActionResult Post([FromBody]string value) { // value will be the request json payload }


Lo siguiente funciona en .net core 1.x, pero no en .net core 2.x.

Como comenté, la solución es usar [FromBody]dynamic data como mi lista de parámetros, usando dynamic lugar de string , y recibiré un JObject .

Precaución: si su arquitectura requiere que un solo servidor WebApi sea igualmente fluido en la producción de XML y JSON, dependiendo de las entradas de encabezado de tipo de contenido, este tipo de estrategia directa-JSON-consumptino puede ser contraproducente para usted. (Compatible con XML y JSON en el mismo servicio es posible con suficiente trabajo, pero luego está tomando cosas que estaban más avanzadas en la canalización de activos MVC y moviéndolas hacia abajo en sus métodos de controlador, lo que resulta estar en contra del espíritu de MVC , donde los modelos vienen a usted como POCOs ya analizados.)

Una vez que convierte a una cadena dentro del método, convierte el JObject entrante (Newtonsoft.JSON en el tipo de datos de memoria para JSON) en una cadena.

Encontrado en here .

Código de muestra, gracias a Jeson Martajaya:

Con dinámico:

[HttpPost] public System.Net.Http.HttpResponseMessage Post([FromBody]dynamic value) { //... }

Código de muestra con JObject:

[HttpPost] public System.Net.Http.HttpResponseMessage Post([FromBody]Newtonsoft.Json.Linq.JObject value) { //... }


Necesita un tipo para enlazar los datos. Ejemplo:

public class Person { public string Name {get; set;} }

para datos { "Name" : "James"}


Si desea recibir una cadena, debe pasarla como una cadena. Su JSON debe estar entre comillas:

''{ "a": 1 }


Veo que Sam ya ha sido votado por decir más o menos lo mismo, pero en las pruebas con Postman me parece que si configuro el cuerpo de la solicitud como una simple cadena doble, ASP se une bien con la cadena predeterminada ''[FromBody] valor ''argumento.

"just send your string like this without any curly braces"

No estoy seguro de si application / json se supone que debe aceptar datos en este formato. Afortunadamente, al publicar este documento, alguien entendido buscará y dirá si esto es válido o no.