如何使用依赖属性反序列化 JSON?



我想知道我是否有一个对象包含一个字段,该字段的反序列化过程依赖于另一个字段,如何反序列化父对象?

容器

class Container
{ 
public int Id { get; set; }
public object Data { get; set; } //deserialization depends on first field
}

等级制度

class FieldType1
{
public string Value { get; set; }
}
class FieldType2
{
public int Numbers { get; set; }
}

给定上面的示例,如果我有一个Dictionary<int,Type>如何反序列化一个字符串形式的对象,如下所示?

var container = new Container { Data = new FieldType1 { Value = "sata" }};
var str = JsonConvert.SerializeObject(container);
var clone = JsonConvert.DeserializeObject<Container>(str);//has dependant field on another field

正如您在上面的示例中所看到的,我始终具有相同的container类型,但一个属性不同。

更新

在这里回答了一些之后,是否可以只保留一种类型的父对象,而是为第二个字段使用基类型?

[JsonSubTypes.KnownSubType(typeof(Child1),1)]
[JsonSubTypes.KnownSubType(typeof(Child2),2)]
public abstract Child
{
}

public class Parent{
public int Id;
public Child child;
}

我可以以某种方式装饰父级以知道如何反序列化其第二个字段(类似于JsonSubTypes)吗?


总而言之,我不想为父母提供P,P1,P2..Pn类型。 我想为父级设置一个类型P,第二个字段F1,F2...Fn类型。因此,当我反序列化时,我只会说JsonConvert.DeserializeObject<P>,而转换器会处理哪个具体类型是第二个字段:

Parent c1=new P{ id=1,child=new Child1()};
Parent c2=new P{ id=2,child=newChild2()};
List<Parent> items=new List<Parent>{c1,c2};
var str=JsonConvert.SerializeObject(items);
var clone=JsonConvert.DeserializeObject<List<Parent>>(str);

乍一看,我只是简单地使用一个简单的函数,你可以把它放到SomeNameParser/Converter类中。

Pesudo C#代码,如下所示:

var jObject = JObject.Parse(obj.Data);
switch (jObject["firstField"])
{
case "fieldType1":
return JsonConvert.DeserializeObject<string>(str);
case "fieldType2":
return JsonConvert.DeserializeObject<int>(str);
default:
Throw new Exception( make this meaningful)
}

改进
你可以让firstField的解析做一个查找来返回一个System.Type,然后将类型传递给JsonConvert.Deserialize(obj.Data, type)这将节省重复的JsonConvert。

希望你能看到一般模式。

相关内容

  • 没有找到相关文章

最新更新