Меню Закрыть

Json asp net core

Содержание

ContentResult отправляет клиенту ответ в виде строки. Так, следующий пример:

Можно переписать с использованием ContentResult:

Для отправки ContentResult не надо использовать конструктор, так как в контроллере уже определен специальный метод Content() , который принимает отправляемую строку и создает объект ContentResult.

JsonResult

Одним из наиболее популярных в наше время форматов хранения и передачи данных является формат JSON (JavaScript Object Notation). JSON не зависит от языка программирования, он более удобен и легче обрабатывается.

В JSON каждый отдельный объект заключается в фигурные скобки и представляет собой набор пар ключ-значение, разделенных запятыми, где ключом является название свойства объекта, а значением соответственно значение этого свойства. Например: <"name":"Tom">. Здесь "name" является ключом, а "Tom" — значением.

Для отправки объекта в формате json в контроллере имеется метод Json(object obj) , который в качестве параметра принимает отправляемый объект. Например:

В данном случае на сторону клиента отправляется строка "Tom".

Допустим, у нас есть следующий класс User:

И тогда для отправки клиенту объекта User мы можем написать следующий метод:

При обращении к методу из адресной стоки браузера веб-браузер выведет полное описание объекта в формате json:

This article explains how to handle JSON Patch requests in an ASP.NET Core web API.

Package installation

Support for JsonPatch is enabled using the Microsoft.AspNetCore.Mvc.NewtonsoftJson package. To enable this feature, apps must:

Update the project’s Startup.ConfigureServices method to include a call to AddNewtonsoftJson :

AddNewtonsoftJson is compatible with the MVC service registration methods:

  • AddRazorPages
  • AddControllersWithViews
  • AddControllers

JsonPatch, AddNewtonsoftJson, and System.Text.Json

AddNewtonsoftJson replaces the System.Text.Json based input and output formatters used for formatting all JSON content. To add support for JsonPatch using Newtonsoft.Json , while leaving the other formatters unchanged, update the project’s Startup.ConfigureServices as follows:

The preceding code requires a reference to Microsoft.AspNetCore.Mvc.NewtonsoftJson and the following using statements:

PATCH HTTP request method

The PUT and PATCH methods are used to update an existing resource. The difference between them is that PUT replaces the entire resource, while PATCH specifies only the changes.

JSON Patch

JSON Patch is a format for specifying updates to be applied to a resource. A JSON Patch document has an array of operations. Each operation identifies a particular type of change, such as add an array element or replace a property value.

For example, the following JSON documents represent a resource, a JSON patch document for the resource, and the result of applying the patch operations.

Resource example

JSON patch example

In the preceding JSON:

  • The op property indicates the type of operation.
  • The path property indicates the element to update.
  • The value property provides the new value.

Resource after patch

Here’s the resource after applying the preceding JSON Patch document:

The changes made by applying a JSON Patch document to a resource are atomic: if any operation in the list fails, no operation in the list is applied.

Path syntax

The path property of an operation object has slashes between levels. For example, "/address/zipCode" .

Zero-based indexes are used to specify array elements. The first element of the addresses array would be at /addresses/0 . To add to the end of an array, use a hyphen (-) rather than an index number: /addresses/- .

Operations

The following table shows supported operations as defined in the JSON Patch specification:

Operation Notes
add Add a property or array element. For existing property: set value.
remove Remove a property or array element.
replace Same as remove followed by add at same location.
move Same as remove from source followed by add to destination using value from source.
copy Same as add to destination using value from source.
test Return success status code if value at path = provided value .
Читайте также:  Как загрузить фото в вк с сайта

JsonPatch in ASP.NET Core

The ASP.NET Core implementation of JSON Patch is provided in the Microsoft.AspNetCore.JsonPatch NuGet package.

Action method code

In an API controller, an action method for JSON Patch:

  • Is annotated with the HttpPatch attribute.
  • Accepts a JsonPatchDocument , typically with [FromBody] .
  • Calls ApplyTo on the patch document to apply the changes.

Here’s an example:

This code from the sample app works with the following Customer model.

The sample action method:

  • Constructs a Customer .
  • Applies the patch.
  • Returns the result in the body of the response.

In a real app, the code would retrieve the data from a store such as a database and update the database after applying the patch.

Model state

The preceding action method example calls an overload of ApplyTo that takes model state as one of its parameters. With this option, you can get error messages in responses. The following example shows the body of a 400 Bad Request response for a test operation:

Dynamic objects

The following action method example shows how to apply a patch to a dynamic object.

The add operation

  • If path points to an array element: inserts new element before the one specified by path .
  • If path points to a property: sets the property value.
  • If path points to a nonexistent location:
  • If the resource to patch is a dynamic object: adds a property.
  • If the resource to patch is a static object: the request fails.

The following sample patch document sets the value of CustomerName and adds an Order object to the end of the Orders array.

The remove operation

  • If path points to an array element: removes the element.
  • If path points to a property:
  • If resource to patch is a dynamic object: removes the property.
  • If resource to patch is a static object:
  • If the property is nullable: sets it to null.
  • If the property is non-nullable, sets it to default .

The following sample patch document sets CustomerName to null and deletes Orders[0] .

The replace operation

This operation is functionally the same as a remove followed by an add .

The following sample patch document sets the value of CustomerName and replaces Orders[0] with a new Order object.

The move operation

  • If path points to an array element: copies from element to location of path element, then runs a remove operation on the from element.
  • If path points to a property: copies value of from property to path property, then runs a remove operation on the from property.
  • If path points to a nonexistent property:
  • If the resource to patch is a static object: the request fails.
  • If the resource to patch is a dynamic object: copies from property to location indicated by path , then runs a remove operation on the from property.

The following sample patch document:

  • Copies the value of Orders[0].OrderName to CustomerName .
  • Sets Orders[0].OrderName to null.
  • Moves Orders[1] to before Orders[0] .

The copy operation

This operation is functionally the same as a move operation without the final remove step.

The following sample patch document:

  • Copies the value of Orders[0].OrderName to CustomerName .
  • Inserts a copy of Orders[1] before Orders[0] .

The test operation

If the value at the location indicated by path is different from the value provided in value , the request fails. In that case, the whole PATCH request fails even if all other operations in the patch document would otherwise succeed.

The test operation is commonly used to prevent an update when there’s a concurrency conflict.

Читайте также:  Сумма распределений по источникам меньше результата расчета

The following sample patch document has no effect if the initial value of CustomerName is "John", because the test fails:

Get the code

To test the sample, run the app and send HTTP requests with the following settings:

  • URL: http://localhost:/jsonpatch/jsonpatchwithmodelstate
  • HTTP method: PATCH
  • Header: Content-Type: application/json-patch+json
  • Body: Copy and paste one of the JSON patch document samples from the JSON project folder.

Additional resources

  • IETF RFC 5789 PATCH method specification
  • IETF RFC 6902 JSON Patch specification
  • IETF RFC 6901 JSON Patch path format spec
  • JSON Patch documentation. Includes links to resources for creating JSON Patch documents.
  • ASP.NET Core JSON Patch source code

This article explains how to handle JSON Patch requests in an ASP.NET Core web API.

PATCH HTTP request method

The PUT and PATCH methods are used to update an existing resource. The difference between them is that PUT replaces the entire resource, while PATCH specifies only the changes.

JSON Patch

JSON Patch is a format for specifying updates to be applied to a resource. A JSON Patch document has an array of operations. Each operation identifies a particular type of change, such as add an array element or replace a property value.

For example, the following JSON documents represent a resource, a JSON patch document for the resource, and the result of applying the patch operations.

Resource example

JSON patch example

In the preceding JSON:

  • The op property indicates the type of operation.
  • The path property indicates the element to update.
  • The value property provides the new value.

Resource after patch

Here’s the resource after applying the preceding JSON Patch document:

The changes made by applying a JSON Patch document to a resource are atomic: if any operation in the list fails, no operation in the list is applied.

Path syntax

The path property of an operation object has slashes between levels. For example, "/address/zipCode" .

Zero-based indexes are used to specify array elements. The first element of the addresses array would be at /addresses/0 . To add to the end of an array, use a hyphen (-) rather than an index number: /addresses/- .

Operations

The following table shows supported operations as defined in the JSON Patch specification:

Operation Notes
add Add a property or array element. For existing property: set value.
remove Remove a property or array element.
replace Same as remove followed by add at same location.
move Same as remove from source followed by add to destination using value from source.
copy Same as add to destination using value from source.
test Return success status code if value at path = provided value .

JsonPatch in ASP.NET Core

The ASP.NET Core implementation of JSON Patch is provided in the Microsoft.AspNetCore.JsonPatch NuGet package. The package is included in the Microsoft.AspnetCore.App metapackage.

Action method code

In an API controller, an action method for JSON Patch:

  • Is annotated with the HttpPatch attribute.
  • Accepts a JsonPatchDocument , typically with [FromBody] .
  • Calls ApplyTo on the patch document to apply the changes.

Here’s an example:

This code from the sample app works with the following Customer model.

The sample action method:

  • Constructs a Customer .
  • Applies the patch.
  • Returns the result in the body of the response.

In a real app, the code would retrieve the data from a store such as a database and update the database after applying the patch.

Model state

The preceding action method example calls an overload of ApplyTo that takes model state as one of its parameters. With this option, you can get error messages in responses. The following example shows the body of a 400 Bad Request response for a test operation:

Читайте также:  Hard reset nokia e52

Dynamic objects

The following action method example shows how to apply a patch to a dynamic object.

The add operation

  • If path points to an array element: inserts new element before the one specified by path .
  • If path points to a property: sets the property value.
  • If path points to a nonexistent location:
  • If the resource to patch is a dynamic object: adds a property.
  • If the resource to patch is a static object: the request fails.

The following sample patch document sets the value of CustomerName and adds an Order object to the end of the Orders array.

The remove operation

  • If path points to an array element: removes the element.
  • If path points to a property:
  • If resource to patch is a dynamic object: removes the property.
  • If resource to patch is a static object:
  • If the property is nullable: sets it to null.
  • If the property is non-nullable, sets it to default .

The following sample patch document sets CustomerName to null and deletes Orders[0] .

The replace operation

This operation is functionally the same as a remove followed by an add .

The following sample patch document sets the value of CustomerName and replaces Orders[0] with a new Order object.

The move operation

  • If path points to an array element: copies from element to location of path element, then runs a remove operation on the from element.
  • If path points to a property: copies value of from property to path property, then runs a remove operation on the from property.
  • If path points to a nonexistent property:
  • If the resource to patch is a static object: the request fails.
  • If the resource to patch is a dynamic object: copies from property to location indicated by path , then runs a remove operation on the from property.

The following sample patch document:

  • Copies the value of Orders[0].OrderName to CustomerName .
  • Sets Orders[0].OrderName to null.
  • Moves Orders[1] to before Orders[0] .

The copy operation

This operation is functionally the same as a move operation without the final remove step.

The following sample patch document:

  • Copies the value of Orders[0].OrderName to CustomerName .
  • Inserts a copy of Orders[1] before Orders[0] .

The test operation

If the value at the location indicated by path is different from the value provided in value , the request fails. In that case, the whole PATCH request fails even if all other operations in the patch document would otherwise succeed.

The test operation is commonly used to prevent an update when there’s a concurrency conflict.

The following sample patch document has no effect if the initial value of CustomerName is "John", because the test fails:

Get the code

To test the sample, run the app and send HTTP requests with the following settings:

Controller that worked in ASP.NET Core 2.0:

in ASP.NET Core 2.1

writes that Json does not exist in the current context. If we remove Json leaving simply

then writes that it was not possible to explicitly convert the type List () to JsonResult

How to convert to Json now?

1 Answer 1

In asp.net-core-2.1 ControllerBase does not have a Json(Object) method. However Controller does.

So either refactor the current controller to be derived from Controller

to have access to the Controller.Json Method or you can initialize a new JsonResult yourself in the action

which is basically what the method does internally in Controller

Рекомендуем к прочтению

Добавить комментарий

Ваш адрес email не будет опубликован.