- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有一个 JSON 输入,其对象全部派生自基类,如下所示:
public abstract class Base
{
public Base Parent { get; set; }
}
我正在尝试创建一个 CustomCreationConverter
以使用 ReadJson
将每个对象的 Parent
属性设置为 JSON 输入中的父节点(当然根节点除外)。这可能吗?我宁愿不必在创建后遍历对象来设置 Parent
属性。
假设我有这个输入 JSON:
{
"Name": "Joe",
"Children": [
{ "Name": "Sam", "FavouriteToy": "Car" },
{ "Name": "Tom", "FavouriteToy": "Gun" },
]
}
我有以下两个类:
public class Person
{
public Person Parent { get; set; }
public string Name { get; set; }
public List<Child> Children { get; set; }
}
public class Child : Person
{
public string FavouriteToy { get; set; }
}
Name
和 FavouriteToy
属性反序列化很好,但我想拥有任何 Person
的 Parent
属性如您所料,对象设置为 JSON 输入中的实际父对象(大概使用 JsonConverter
)。到目前为止,我能够实现的最佳效果是在反序列化后递归遍历每个对象并以这种方式设置 Parent
属性。
我想指出,我知道我可以使用 JSON 本身内部的引用来做到这一点,但我宁愿避免这样做。
该问题涉及创建正确派生类的实例,我遇到的问题是在对象反序列化期间找到获取上下文的方法。我正在尝试使用 JsonConverter 的 ReadJson 方法设置反序列化对象的属性以引用同一 JSON 输入中的另一个对象,不使用 $ref
s。
最佳答案
我最好的猜测是您正在寻找这样的东西:
public override bool CanConvert(Type objectType)
{
return typeof(Person).IsAssignableFrom(objectType);
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
object value = Activator.CreateInstance(objectType);
serializer.Populate(reader, value);
Person p = value as Person;
if (p.Children != null)
{
foreach (Child child in p.Children)
{
child.Parent = p;
}
}
return value;
}
注意:如果您经常反序列化此类(例如从 Web 应用程序中的 http 请求反序列化模型),使用预编译工厂创建对象将获得更好的性能,而不是使用对象激活器:
object value = serializer.ContractResolver.ResolveContract(objectType).DefaultCreator();
请注意,无法访问父对象,因为父对象总是在其子对象之后创建。也就是说,您需要读取对象所包含的 json 直到最后才能完全构造对象,并且在读取对象的最后一个括号时,您已经读取了它的所有子对象。当一个 child 解析时,还没有 parent 获得引用。
关于c# - 没有 $refs 的 JsonConverter : Get parent object in ReadJson,,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30769476/
编辑:澄清问题: 我已经覆盖了基类型的 JsonConverter(通过将 [JsonConverter(typeof(TConverter))] 应用于父类(super class)),但是当直接反
尝试使用 JsonConvert.PopulateObject 更新类属性时,未调用 JsonPathConverter,因此未完成填充。 示例类: [JsonConverter(typeof(Jso
我有一个我不能改变的类: public enum MyEnum { Item1 = 0, Item2 = 1 } public class foo { [JsonConvert
我正在使用 Json.NET (6.0.3) 进行序列化。我编写了一个自定义 JsonConverter TestConverter 来处理一些 BaseClass 的实例(通过将它们转换为整数 id
我有一个要求,我需要将默认值设置为下面的复杂属性 Instances使用 JsonProperty和 DefaultValue . 我知道我们可以为以下链接中提到的原始属性实现这一点,但需要知道我们如
我尝试查找上述比较,但找不到答案。 因为有多种方法可以获取 JObject(或所有继承自 JToken 的子类型)例如: Method1 . JObject.FromObject(obj); Meth
我已启用我的 API 以使用字符串值序列化/反序列化枚举。为此,我已将 JsonStringEnumConverter 添加到 API 的 Startup 类中受支持的 JsonConverter 列
我有一个 Employee 类,其中 Manager 属性本身是 Employee 类型 public class Employee { public string FirstName { g
我已经卡住模型(简化): part 'initial_data_model.freezed.dart'; part 'initial_data_model.g.dart'; @freezed clas
我正在尝试将两个字段和一个包含两个字段的捆绑对象发布到 Mailchimp 的 API 端点。 var store_id = ConfigurationManager.AppS
以下VB.NET代码使用Newtonsoft JSON.NET库,并在按钮单击事件处理程序中执行并阻止UI线程: Dim table As DataTable = Await Task.Factory
我遇到了一个问题,其中以下 ToJson() 方法返回的字符串仅为“{}” public class GenericRequest { publ
这个问题在这里已经有了答案: JSON Can't be Deserialized to Object, Needs Array? (2 个答案) 关闭 9 年前。 我有这个 Json 返回: [
我遇到了一个问题,其中以下 ToJson() 方法返回的字符串仅为“{}” public class GenericRequest { publ
这个问题在这里已经有了答案: JSON Can't be Deserialized to Object, Needs Array? (2 个答案) 关闭 9 年前。 我有这个 Json 返回: [
我创建了一个简单的类: public class TestObject { public TestObject(int id, string name, List list) {
我有一个像这样的 Json 对象: {"company": "My Company", "companyStart" : "2015/01/01", "employee" : { "name"
这是 json: { "odata.metadata": ".....", "value": [ { "AbsEntry": 10,
我有一个对象,其中包含一个具有 JsonConverter 属性的属性。对于数据读写,转换器不工作。声明的属性是 [JsonConverter(typeof(EpochDateTimeConverte
编辑:制作了一个更简单、更透明的示例案例 我正在尝试反序列化一组组件(属于一个实体)。其中一个组件是 Sprite 组件,它包含纹理和动画信息。我为此实现了一个 CustomConverter,因为原
我是一名优秀的程序员,十分优秀!