Добавьте JsonElement в JsonPatchDocument.C#

Место общения программистов C#
Ответить
Anonymous
 Добавьте JsonElement в JsonPatchDocument.

Сообщение Anonymous »

Я работаю над созданием JsonPatchDocument (MSDN) в .NET (а не просто с принятием через конечную точку). Мне бы очень хотелось использовать для этого System.Text.Json, а не Newtonsoft.JSON, но я не могу найти эквивалентную функциональность. Насколько я могу судить, рекомендации Microsoft по замене JObject не охватывают такое поведение.
На этом этапе кода я работал с JsonDocument и определил новый JsonElement, который необходимо добавить в исправление.
В RFC приведены два примера документов и их исправление JSON:

Код: Выделить всё

Start: { "foo": "bar" }
Patch: [{ "op": "add", "path": "/child", "value": { "grandchild": { } } }]
End: {"foo": "bar","child": {"grandchild": { } } }
Я попробовал много разных сортов, но не все сохранил. Но вот несколько способов не добиться этого:

Код: Выделить всё

using System.Text.Json;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using Microsoft.AspNetCore.JsonPatch;

// JsonElement element is the change we want to see added in the patch
JsonPatchDocument patchDocument = new JsonPatchDocument();
patchDocument.Add(path, element); // Only the JsonElement property comes through. Gives [{"value":{"ValueKind":1},"path":"/child","op":"add"}]
patchDocument.Add(path, element.GetRawText()); // Obviously treated as a string so fails and gives [{"value":"{\n       \"grandchild\": {\n       }\n     }","path":"/child","op":"add"}]
patchDocument.Add(path, element.GetString()); // Similar to the above attempt, but fails because element is an Object and throws exception. Attempting to replicate Newtonsoft's ToObject gives the next example
patchDocument.Add(path, netjson.JsonSerializer.Deserialize(element.GetRawText())); // Just a more convoluted version of our first attempt. Gives [{"value":{"ValueKind":1},"path":"/child","op":"add"}]
Вот рабочий код, который использует Newtonsoft.Json для получения моего JsonElement и создания правильного вывода исправления. (но это очень грубо)

Код: Выделить всё

JsonPatchDocument patchDocument = new JsonPatchDocument();
JsonDocument newDocument = JsonDocument.Parse("{ \"foo\": \"bar\", \"child\": {\"grandchild\": { } } }");
JsonElement parentObject = newDocument.RootElement;
JsonElement element = parentObject.GetProperty("child");

// This is more dynamic in real code, but hardcoded for example

patchDocument.Add("/", JObject.Parse(parentObject.GetRawText()).Property("child").Value); // Correct answer [{\"value\":{\"grandchild\":{}},\"path\":\"/\",\"op\":\"add\"}]
Я могу (и на данный момент делаю это) просто используя Newtonsoft.Json. Но поскольку на самом деле это не путь будущего, есть ли способ успешно предоставить правильное значение JsonPatchDocument.Add с помощью System.Text.Json?

Подробнее здесь: https://stackoverflow.com/questions/663 ... chdocument
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»