我得到了这样的数据模型:
public struct Person
{
public string Name;
public Address[] Addresses;
}
public struct Address
{
public string HouseNumber;
public string StreetName;
}
我想使用Newtonsoft JSON(或替代方案)将一系列人员序列化和反序列化为两个不同的数据源/ Web API,两者都对这些属性进行不同的命名。
例如,源1将返回如下内容:
[{"name":"John", "addresses":[{"house":12, "name","Floura St"}]}]
源2就像:
[{"person-name":"John", "addresses":[{"houseNumber":12, "street-name","Floura St"}]}]
实际数据可以包含来自不同来源的更多或更少的字段。
我的想法是为两个不同的来源提供两个不同的JsonSerializerSettings
ContractResolver
或不同的JsonConverter[]
。
我尝试覆盖ResolvePropertyName
的{{1}}但是没有用,因为无法知道它为哪个类型解析属性名称。我需要这个,因为一些属性在不同类型之间具有相同的名称。
我还尝试在DefaultContractResolver
覆盖CreateProperties
,但没有弄清楚如何更改属性名称的映射。
最后我尝试写这样的东西:
DefaultContractResolver
但我不确定这是否是正确的方法,特别是我需要从头开始编写所有读写代码。有没有更好的方法来覆盖我有兴趣改变的行为而不重新发明轮子?此外,我不确定如何创建private class DynamicConverter<T> : JsonConverter
{
public DynamicConverter(Dictionary<string, string> propertiesMap)
{
}
public override bool CanConvert(Type objectType)
{
return objectType == typeof(T);
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue,
JsonSerializer serializer)
{
}
}
和Person
的新实例,因为它们是结构而不是类。
注意:正如您可能已经猜到的那样,我没有多少访问权限 更改模型结构以使其成为类或使用标记它们 Newtonsoft JSON属性。事实上,我的团队更愿意离开他们 未触及且未引用JSON库,因为模型结构化 住在一个公共图书馆,用于许多其他的东西不是 与JSON序列化有关。
另请注意,这是一个简单的示例来演示我的问题, 实际的数据结构比较复杂,例如有 数十个结构和两个以上级别的嵌套数组。