将Json字符串映射到多个对象

时间:2018-08-19 01:22:04

标签: c# json mapping deserialization

为简洁起见,重写问题。

我需要能够一次反序列化和/或将json字符串映射到多个具体对象,其中一些对象是嵌套的。我无法控制接收到的json字符串。我将如何去做呢?

示例:

// Example objects
public class ClassA
{
    public string Prop1 { get; set; }
    public string Prop2 { get; set; }
    public string Prop3 { get; set; }
}

public class ClassB
{
    public string Prop1 { get; set; }
    public string Prop2 { get; set; }
    public string Prop3 { get; set; }
    public ClassC Nested { get; set; }
}

public class ClassC
{
    public string Prop1 { get; set; }
    public string Prop2 { get; set; }
    public string Prop3 { get; set; }
}

//Example "records" or rows

// All values
{
    "ClassA.Prop1" : "Value"
    "ClassA.Prop2" : "Value"
    "ClassA.Prop3" : "Value"
    "ClassB.Prop1" : "Value"
    "ClassB.Prop2" : "Value"
    "ClassB.Prop3" : "Value"
    "ClassB.Nested.Prop1" : "Value"
    "ClassB.Nested.Prop2" : "Value"
    "ClassB.Nested.Prop3" : "Value"
}

// Partial Data
{
    "ClassA.Prop1" : "Value"
    "ClassA.Prop2" : "Value"
    "ClassB.Prop1" : "Value"
    "ClassB.Nested.Prop1" : "Value"
    "ClassB.Nested.Prop2" : "Value"
}

1 个答案:

答案 0 :(得分:0)

对问题的简洁性表示歉意。我已经为此苦苦挣扎了好几天了,当时我的头在键盘上跳动着,在没有清楚地思考问题的情况下提出了这个问题。

我刚刚解决了自己的问题。问题是我试图将序列化为json的非标准化数据集直接转换为具体对象,这很麻烦。它们是否嵌套是无关紧要的。答案是我一直都在看模型。我需要反序列化为表示电子表格中一行(或记录)的对象。从那里开始,很容易提取具体对象并建立所需的关系。简短的答案?我试图跳过一步。这是解决方案。

public class SpreadsheetRow
{
    public string ClassAProp1 { get; set; }
    public string ClassAProp2 { get; set; }
    public string ClassAProp3 { get; set; }
    public string ClassBProp1 { get; set; }
    public string ClassBProp2 { get; set; }
    public string ClassBProp3 { get; set; }
    public string ClassCProp1 { get; set; }
    public string ClassCProp2 { get; set; }
    public string ClassCProp3 { get; set; }

    public ClassA GetClassA()
    {
        return new ClassA
        {
            Prop1 = ClassAProp1,
            Prop2 = ClassAProp2,
            Prop3 = ClassAProp3,
        };
    }

    public ClassB GetClassB()
    {
        return new ClassB
        {
            Prop1 = ClassBProp1,
            Prop2 = ClassBProp2,
            Prop3 = ClassBProp3,
            Nested = new ClassC
            {
                Prop1 = ClassCProp1,
                Prop2 = ClassCProp2,
                Prop3 = ClassCProp3,
            }
        };
    }
}
}