gpt4 book ai didi

c# - 使用通用 RootObject 来处理根处具有不同属性名称的 JSON

转载 作者:太空宇宙 更新时间:2023-11-03 23:42:33 24 4
gpt4 key购买 nike

我正在使用 Json.Net,我正在寻找有关如何在运行时反序列化期间更改 JsonProperty 名称的想法。为什么你会问,主要是因为我不喜欢有大量具有完全相同结构的“RootObject”类。

考虑以下“根对象”。

 public class Rootobject1
{
[JsonProperty("tasks")]
public List<Task> Data { get; set; }
}

public class Rootobject2
{
[JsonProperty("projects")]
public List<Project> Data { get; set; }
}

public class Rootobject3
{
[JsonProperty("countries")]
public List<Country> Data { get; set; }
}

似乎有很多冗余代码。所以我正在寻找选择。我想到的一些是:

为一些简单的条件逻辑使用属性参数的东西:

 public class Rootobject<T>
{
[JsonProperty("projects", whenType=typeof(Project))]
[JsonProperty("tasks", whenType=typeof(Task))]
[JsonProperty("countries", whenType=typeof(Country))]
public List<T> Data { get; set; }
}

或者可能与运行时配置类似的东西?

 var projects = JsonConvert.DeserializeObject<Rootobject<Project>>(json, RootName="projects")

var tasks = JsonConvert.DeserializeObject<Rootobject<Tasks>>(json, RootName="tasks")

所以我很好奇,有没有人想出一种富有创意且优雅的处理方式?

最佳答案

您可以使用自定义契约(Contract)解析器来执行此操作。解析器可以有效地更改序列化程序在运行时查找的 JSON 属性名称。这是您需要的代码:

class CustomResolver : DefaultContractResolver
{
string rootName;

public CustomResolver(string rootName)
{
this.rootName = rootName;
}

protected override IList<JsonProperty> CreateProperties(Type type, MemberSerialization memberSerialization)
{
IList<JsonProperty> props = base.CreateProperties(type, memberSerialization);

if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(RootObject<>))
{
JsonProperty prop = props.First(p => p.UnderlyingName == "Data");
prop.PropertyName = this.rootName;
}

return props;
}
}

下一部分是创建一个辅助方法以在反序列化时应用解析器:

public static RootObject<T> Deserialize<T>(string json, string rootName)
{
JsonSerializerSettings settings = new JsonSerializerSettings();
settings.ContractResolver = new CustomResolver(rootName);
return JsonConvert.DeserializeObject<RootObject<T>>(json, settings);
}

然后您可以根据需要在问题中调用助手:

RootObject<Project> projects = Deserialize<Project>(projectJson, "projects");

完整演示在这里:https://dotnetfiddle.net/yEBLkx

关于c# - 使用通用 RootObject 来处理根处具有不同属性名称的 JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28540601/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com