Как создать собственный десериализатор json, который возвращает имя поля и значения из динамического json [дубликат]C#

Место общения программистов C#
Ответить
Anonymous
 Как создать собственный десериализатор json, который возвращает имя поля и значения из динамического json [дубликат]

Сообщение Anonymous »

Я хочу создать десериализатор JSON, который возвращает определенный тип.
JSON может быть в формате, который соответствует SpecificOne илиSpecificTwo. Мы знаем это только во время выполнения. После десериализации мне нужно извлечь поля и значения в форме класса Response.
Можем ли мы создать собственный десериализатор, который будет извлекать поля и значения?
var resp = JsonSerializer.Deserialize(json);

Также как-то избегайте использования отражения.
Результат должен выглядеть так:
{
"FieldName": "Address",
"FieldValue": "Some Address"
}

using System.Reflection;
using System.Text.Json;
using System.Text.Json.Serialization;

class Program
{
public static void Main(string[] args)
{
string json = """
{
"Id" : 1,
"Details": {
"$type": "AddressChange",
"Address": "Some Address"
}
}
""";

MyClass obj = JsonSerializer.Deserialize(json);

List fields = [];
var details = obj.Details;

Type type = details.GetType();

foreach (PropertyInfo prop in type.GetProperties())
{
object? value = prop.GetValue(details);

if (value is not null)
{
fields.Add(new Response
{
FieldName = prop.Name,
FieldValue = value.ToString() ?? string.Empty
});
}
}
}

public class MyClass
{
public int Id { get; set; }
public Parent Details { get; set; }
}

[JsonPolymorphic(TypeDiscriminatorPropertyName = "$type")]
[JsonDerivedType(typeof(SpecificOne), "AddressChange")]
[JsonDerivedType(typeof(SpecificTwo), "NameChange")]
public abstract class Parent
{
}

public class SpecificOne : Parent
{
public string Address { get; set; }
}

public class SpecificTwo : Parent
{
public string Name { get; set; }
}

public class Response
{
public string FieldName { get; set; }
public string FieldValue { get; set; }
}
}


Подробнее здесь: https://stackoverflow.com/questions/798 ... and-the-va
Ответить

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

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

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

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

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