У меня есть следующие JS строка:Json.NET десериализации или сериализации 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» в «differen_property_name1» или «differen_property_name2» или «differen_property_name3». Поскольку я выбираю новое имя во время выполнения (новое название, к которому я изменю название «property1» к), я не могу использовать решение с использованием JsonPropertyAttribute, как предложено здесь:
.NET NewtonSoft JSON deserialize map to a different property name
Один из ответов на этот вопрос (ответ Джека) использует наследование DefaultContractResolver, но в этом случае он не работает.
Update
Позже, мне нужно сериализовать объект я получил от десериализации и сопоставления свойств различных имен свойств, определенных во время выполнения. Я использовал тот же метод, как Брайан предложил сделать сериализации:
Я использовал словарь, чтобы отобразить мои новые имена свойств:
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);
Потому что я хочу, чтобы решить, во время выполнения которых новое имя, которое я хочу, чтобы дать собственность и JsonPropertyAttribute вы должны использовать «жесткий кодированный» имя. –
Одним из способов (хотя это может быть некрасиво) было бы сначала десериализовать JSON, а затем сопоставить десериализованный объект с объектом с новыми именами. Однако может быть более элегантный способ. – Tim
@Tim, как бы вы сопоставили десериализованный объект с объектом с новыми именами, когда новые имена должны определяться во время выполнения? –