如何从JSON反序列化不同类型的数组

时间:2018-04-14 07:02:38

标签: c# json

我有JSON字符串,如下所示:

{
    "type": "group",
    "logicalOperator": "or",
    "conditions":[{
            "type": "condition",
            "metric": "CTR",
            "operator": ">=",
            "value": "123"
        },
        {
            "type": "group",
            "logicalOperator": "and",
            "conditions": [{
                "type": "condition",
                "metric": "CTR",
                "operator": ">=",
                "value": "123"
                }]
        }
    ]
}

我想将其反序列化为C#类(使用Newtonsoft.JSON)。但conditions可以包含groupcondition的问题对我来说是个问题。

public class Group {
    public string logicalOperator { get; set; }
    public List<object> conditions { get; set; }
}

public class Condition {
    public string metric { get; set; }
    public string @operator { get; set; }
    public int value { get; set; }
}

如何摆脱List<object>? TIA!

2 个答案:

答案 0 :(得分:0)

首先,C#不会反序列化json字符串。 C#可用于调用具有的库。

基于纯粹的猜测,我会继续说你可能正在使用Newtonsoft.Json进行反序列化,尽管你很可能正在使用别的东西。我们退一步吧。

如果是这种情况,那么“摆脱”List<object>将成为您最关心的问题。实际上能够提出不仅仅是空的实例,普通的System.Object实例将是你的第一个挑战。这只是因为告诉反序列化器你的超级(基础)类型是什么甚至不会让他们去寻找可能的子类型,因为任何类型的子类型都是一个开放的集合(任何人都可以采取并引用你的程序集并扩展你的类而不感觉任何东西)。

列出System.Object类型的引用列表,每个引用类型MyNamespace.GroupMyNamespace.Condition的实例可能看起来像拖累,直到您意识到拥有MyNamespace.Group的实例和另一个是您正在描述的特定用例中的实际挑战。

再次退一步,在OOP中,只要你想存储一个可能不同类型的实例的列表,并且你的语言是强类型的并提供某种泛型(包括C#),你就不能有一个泛型的元素参数类型,不能从您希望实例可能存在的每个特定类型中隐式分配。在您的情况下,object与超过GroupCondition的内容兼容。如果那是你唯一的问题那么你应该简单地创建一个第三类(让我们称之为EitherGroupOrCondition)并使其成为自然发生的类层次结构的根(现在GroupCondition延伸EitherGroupOrCondition)。然后,您可以将List<object>变为List<EitherGroupOrCondition>

回到反序列化:您需要查看JsonSerializerSettings.TypeNameHandling及其随行人员。

您应该考虑以下先决条件来实现目标:

  • 彻底了解OOP
  • 了解您的特定Json解串器的功能(希望您使用的是Newtonsoft.Json

这两个先决条件都需要时间和耐心,我鼓励你继续填写它们,绝不盲目地工作,至少不了解你正在使用的产品表面。

答案 1 :(得分:0)

你没有问题:

new_user_session_path()

然后将其正常反序列化

public class YourType
{
    public ConditionType Type { get; set; }
    public string Metric { get; set; }
    public string Operator { get; set; }
    public int Value { get; set; }
    public string LogicalOperator { get; set; }

    public List<YourType> Conditions { get; set; }
}

public enum ConditionType
{
    Group,
    Condition
}

您最终会得到一个var result = JsonConvert.DeserializeObject<YourType>(yourJson); 类,其中包含一个枚举数YourType,可用于确定其是一个组还是一个条件。

如果是条件,则填写属性。

如果是群组,则Type内部列表包含其余内容。