Newtonsoft JSON动态自定义属性名称

时间:2017-10-27 03:56:39

标签: c# json json.net

我得到了这样的数据模型:

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[]

  1. 我尝试覆盖ResolvePropertyName的{​​{1}}但是没有用,因为无法知道它为哪个类型解析属性名称。我需要这个,因为一些属性在不同类型之间具有相同的名称。

  2. 我还尝试在DefaultContractResolver覆盖CreateProperties,但没有弄清楚如何更改属性名称的映射。

  3. 最后我尝试写这样的东西:

    DefaultContractResolver
  4. 但我不确定这是否是正确的方法,特别是我需要从头开始编写所有读写代码。有没有更好的方法来覆盖我有兴趣改变的行为而不重新发明轮子?此外,我不确定如何创建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序列化有关。

         

    另请注意,这是一个简单的示例来演示我的问题,   实际的数据结构比较复杂,例如有   数十个结构和两个以上级别的嵌套数组。

0 个答案:

没有答案