【发布时间】:2016-11-01 20:27:08
【问题描述】:
我有以下 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
上述问题的一个答案(Jack 的答案)使用 DefaultContractResolver 的继承,但在这种情况下似乎不起作用。
更新
稍后,我需要序列化从反序列化中获得的对象,并将属性映射到不同的属性名称,在运行时定义。 我使用了与 Brian 建议的相同方法进行序列化:
我使用字典来映射我的新属性名称:
var map = new Dictionary<Type, Dictionary<string, string>>
{
{
typeof(Details),
new Dictionary<string, string>
{
{"property1", "myNewPropertyName1"},
{"property2", "myNewPropertyName2"},
{"property3", "myNewPropertyName3"},
{"property4", "myNewPropertyName4"}
}
}
};
然后我使用 Brian 的 DynamicMappingResolver 像这样序列化对象:
var settings = new JsonSerializerSettings
{
ContractResolver = new DynamicMappingResolver(map)
};
var root = JsonConvert.SerializeObject(myObjectInstance, settings);
【问题讨论】:
-
因为我想在运行时决定我想为属性赋予哪个新名称,并且使用 JsonPropertyAttribute 你必须使用“硬编码”名称。
-
一种方法(虽然它可能很难看)是首先反序列化 JSON,然后将反序列化的对象映射到具有新名称的对象。不过,可能还有更优雅的方式。
-
@Tim,当需要在运行时定义新名称时,如何将反序列化对象映射到具有新名称的对象?
-
如何定义目标?代码DOM?匿名类型?您会在应用程序中映射到很多很多类吗?我可以想到一个折中的方法,但它可能有助于了解您要做什么。
标签: c# json json.net json-deserialization