gpt4 book ai didi

c# - 将 JSON 中的嵌套对象反序列化为特定类型

转载 作者:太空宇宙 更新时间:2023-11-03 21:29:31 25 4
gpt4 key购买 nike

我在 C# 端有一个看起来像这样的类:

[DataContract]
public class MyObject
{
[DataMember]
public SomeEnum FooType { get; set; }

[DataMember]
public FooBase MyFoo { get; set; }
}

基本上,属性 FooType 中的值应该告诉您从 FooBase 派生的特定类型出现在属性 MyFoo 中。

现在,如果我只想反序列化从 FooBase 派生的对象,我可以这样做:

var myFoo = JsonConvert.DeserializeObject(myJsonString, typeof(FooDerived)) as FooDerived;

但是如何反序列化嵌套了 FooBase 对象的 MyObject 并且只能通过先部分反序列化对象来确定有关它是什么类型的信息?

我认为这将需要一个从 JsonConverter 派生的自定义转换器,但我不完全确定如何使 ReadJson 在这里工作。

是这样的吗?

public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
var result = new MyObject();
while(reader.Read())
{
if(reader.TokenType == JsonToken.PropertyName)
{
var prop = reader.Value as string;
if (prop == "FooType")
{
reader.Read();
result.FooType = (SomeEnum)reader.ReadAsInt32(); // or something like that
}
if (prop == "MyFoo")
{
reader.Read();
// now the reader.TokenType should be StartObject, but I can't
// deserialize the object because I don't know what type it is
// I might not have read "FooType" yet
// So I really need to pull this whole sub object out as a string
// and deserialize it later???
}
}
}
return result;
}

最佳答案

以此答案为灵感:https://stackoverflow.com/a/19308474/1250301

我想到了这样的事情:

public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
var jObj = JObject.Load(reader);
var foo = jObj["MyFoo"];
var result = new MyObject();
result.FooType = jObj["FooType"].ToObject<SomeEnum>();
switch (result.FooType)
{
case SomeEnum.Value1:
result.MyFoo = foo.ToObject<FooType1>();
break;
case SomeEnum.Value2:
result.MyFoo = foo.ToObject<FooType2>();
break;
case SomeEnum.Value3:
result.MyFoo = foo.ToObject<FooType3>();
break;
default:
throw new Exception("Unknown FooType");
}
return result;
}

这里唯一的问题是,如果我向父对象添加新属性,我将需要手动映射它们。我以为我可以做类似的事情:

var parent = jObj.ToObject<MyObject>(); 

然后填写MyFoo对象,但这只会再次调用ReadJson

关于c# - 将 JSON 中的嵌套对象反序列化为特定类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25021768/

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