.NET Сериализация сложной строки Dto в JSONC#

Место общения программистов C#
Ответить
Anonymous
 .NET Сериализация сложной строки Dto в JSON

Сообщение Anonymous »

Я работаю со структурой Dto, которая выглядит следующим образом. Я опущу информацию о других производных типах, поскольку они не являются частью рассматриваемой проблемы. Обратите внимание, что свойства OldValue и NewValue на самом деле могут быть одним из многих других Dto (многотипизированных).
[JsonDerivedType(typeof(ChangeBucketDto), "changeBucketDto")][JsonDerivedType(typeof(TrackedChangeDto), "trackedChangeDto")]
public class Dto
{
///
/// The unique identifier of the entity
///
[JsonProperty("key")]
public required string Key { get; set; }
}

public class ChangeBucketDto : Dto
{
[Required]
[JsonProperty("text")]
public required string Text { get; set; }
[Required]
[JsonProperty("changes")]
public required List Changes { get; set; }
}

public class TrackedChangeDto : Dto
{
[Required]
[JsonProperty("origin")]
public required ChangeOrigin Origin { get; set; }
[JsonProperty("oldValue")]
public dynamic? OldValue { get; set; }
[JsonProperty("newValue")]
public dynamic? NewValue { get; set; }
[Required]
[JsonProperty("changeType")]
public required string ChangeType { get; set; }
[Required]
[JsonProperty("displayOrder")]
public required List DisplayOrder { get; set; }
[Required]
[JsonProperty("lastModified")]
public required DateTime LastModified { get; set; }
[Required]
[JsonProperty("live")]
public required bool Live { get; set; }
}

Использование JSON, полученного в результате следующей функции.
public async Task WriteChangesAsJson(StorageEnvironment environment, [FromBody] List json)
{
return await WriteAllAsJson(environment, json);
}

Я попытаюсь сериализовать его в Dto, который можно будет использовать для обработки. Тип TDto наследуется от контроллера, на который ссылается служба, и который настраивается при запуске. Этот тип также сопоставляется с помощью AutoMapper с соответствующей моделью.
async Task IStorageService.WriteAllAsync(ConnectionPropertiesModel connectionProperties, dynamic json)
{
try
{
string stringified = JsonConvert.SerializeObject(json, Formatting.Indented);

// Write a new file content to the blob
await _repository.WriteAsync(connectionProperties, jsonString:stringified);
}
catch (ConnectionPropertiesException connectionEx)
{
IError error = _errorFactory.CreateError(ErrorCode.ServiceNoAccess, _exceptionResourceManager.GetString("ServiceAccessExc")!);
throw new ServiceAccessException(error, connectionEx);
}
}

Полученный массив ChangeBucket правильно содержит объект TrackedChange в правильном сегменте, однако OldValue и NewValue не будут содержать значения соответствующего Dto. Вместо этого будет отображаться ValueKind.
{
"text": "Highlights",
"changes": [
{
"origin": {
"ContainerName": "highlights",
"FileName": "highlights.json"
},
"oldValue": {
"ValueKind": 1
},
"newValue": {
"ValueKind": 1
},
"changeType": "Update",
"displayOrder": [
"key",
"languages",
"enabled",
"repeat",
"timeSpan",
"timeStampFrom",
"timeStampTo"
],
"lastModified": "2024-05-13T14:13:11.629Z",
"live": true,
"key": "change-highlights-Maintenance"
}
],
"key": "highlights"
},

РЕДАКТИРОВАТЬ: Теперь я понимаю, что существует некоторая смесь между System.Text.Json и NewtonSoft.Json, которая вызывает проблему здесь. Моя конечная цель — иметь возможность читать этот объект целиком, используя только один из них, но я не совсем уверен, что мне нужно для этого.
EDIT2: По запросу я включаю полный JSON с описанием того, как может выглядеть сообщение для контроллера отслеживания изменений, включая два примера Dto, которые он может получить.
[
{
"text": "Vragen",
"changes": [],
"key": "questions"
},
{
"text": "Berichten",
"changes": [
{
"origin": {
"ContainerName": "answers",
"FileName": "answers.json"
},
"oldValue": {
"key": "Foo",
"languages": [
"NL": "Bor"
"EN": "Bar"
],
"type": "message"
},
"newValue": {
"key": "Foo",
"languages": [
"NL": "Bar"
"EN": "Bar"
],
"type": "message"
},
"changeType": "Update",
"displayOrder": [
"key",
"languages",
"type"
],
"lastModified": "2024-05-13T17:23:30.509Z",
"live": true,
"key": "change-highlights-Maintenance"
}
],
"key": "highlights"
"key": "answers"
},
{
"text": "FAQs",
"changes": [],
"key": "faqs"
},
{
"text": "Dialogen",
"changes": [],
"key": "dialogs"
},
{
"text": "Highlights",
"changes": [
{
"origin": {
"ContainerName": "highlights",
"FileName": "highlights.json"
},
"oldValue": {
"key": "Foo",
"languages": [
"NL": "Bor"
"EN": "Bar"
],
"enabled": "true",
"repeat": "true",
"timeSpan": 7,
"timeStampFrom": "2023-12-13T11:50",
"timeStampTo": "2023-12-13T17:00"
},
"newValue": {
"key": "Foo",
"languages": [
"NL": "Bar"
"EN": "Bar"
],
"enabled": "true",
"repeat": "true",
"timeSpan": 7,
"timeStampFrom": "2023-12-13T11:50",
"timeStampTo": "2023-12-13T18:00"
},
"changeType": "Update",
"displayOrder": [
"key",
"languages",
"enabled",
"repeat",
"timeSpan",
"timeStampFrom",
"timeStampTo"
],
"lastModified": "2024-05-13T17:23:30.509Z",
"live": true,
"key": "change-highlights-Maintenance"
}
],
"key": "highlights"
},
{
"text": "Groepsincidenten",
"changes": [],
"key": "groupincidents"
},
{
"text": "Kennisbanken",
"changes": [],
"key": "knowledgesources"
}
]


Подробнее здесь: https://stackoverflow.com/questions/784 ... son-string
Ответить

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

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

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

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

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