Json.NET десериализует или сериализует строку json и отображает свойства в разные имена свойств, определенные во время выполнения
У меня есть следующая строка JSON:
{
"values": {
"details": {
"property1": "94",
"property2": "47",
"property3": "32",
"property4": 1
},
count: 4
}
}
Я собираюсь сопоставить это со следующей моделью:
public class Details
{
public string property1 { get; set; }
public string property2 { get; set; }
public string property3 { get; set; }
public int property4 { get; set; }
}
public class Values
{
public Details details { get; set; }
public int count { get; set; }
}
public class RootObject
{
public Values values { get; set; }
}
Я хочу иметь возможность сопоставлять имена этих свойств с разными именами во время выполнения при десериализации этой строки JSON следующим образом:
JsonConvert.DeserializeObject<RootObject>(jsonString);
Например, в процессе десериализации я хочу десериализовать имя «property1» в «diff_property_name1» или «diff_property_name2» или «дифференциал_property_name3». Так какЯ выбираю новое имя во время выполнения (новое имя, на которое я изменю имя «property1»), я не могу использовать решение с использованием JsonPropertyAttribute, как предлагается здесь:
.NET NewtonSoft JSON десериализует карту с другим именем свойства
Один из ответов на поставленный выше вопрос (ответ Джека) использует наследование DefaultContractResolver, но в этом случае он не работает.
Обновить
Позже мне нужно было сериализовать объект, полученный в результате десериализации, и сопоставить свойства с различными именами свойств, определенными во время выполнения. Я использовал тот же метод, который предложил Брайан для сериализации:
Я использовал словарь для сопоставления моих новых имен свойств:
var map = new Dictionary<Type, Dictionary<string, string>>
{
{
typeof(Details),
new Dictionary<string, string>
{
{"property1", "myNewPropertyName1"},
{"property2", "myNewPropertyName2"},
{"property3", "myNewPropertyName3"},
{"property4", "myNewPropertyName4"}
}
}
};
и затем я использовал DynamicMappingResolver Брайана для сериализации объекта следующим образом:
var settings = new JsonSerializerSettings
{
ContractResolver = new DynamicMappingResolver(map)
};
var root = JsonConvert.SerializeObject(myObjectInstance, settings);