反序列化嵌套 JSON,映射到模型并保存

Deserialize Nested JSON, Map to Model and Save

我的初始版本能够获取 JSON 的一个片段,将“键值”对映射到一个对象并将其相应地存储到数据库中,例如:

{
    "msee": 11976.16796875,
    "r2": -0.8027065992355347,
    "std": 109.59520721435547,
    "avg": -2.3448710441589355,
    "min": -386.17926025390625,
    "max": 405.26837158203125,
    "out_file": "test.png"
}

然后我有我的 class ResultData

public class ResultData
    {

        public float Msee { get; set; }

        public float R2 { get; set; }

        ....

    }

我获取了该数据并将其反序列化:

var resultDataModel = JsonConvert.DeserializeObject<Models.ResultData>(content);

相应地映射数据

var resultData = resultDataModel.ToData();

然后保存到数据库:

await _dataContext.ResultData.AddAsync(resultData);

现在我想对我的代码进行的更改是,如果我的传入 JSON 是嵌套的,即

{
    "train": {
        "msee": 0.00011604210158111528,
        "r2": 1.0,
        "std": 0.010741780512034893,
        "avg": -0.0009074629051610827,
        "min": -0.022330284118652344,
        "max": 0.2726593017578125,
        "out_file": "train.png"
    },
    "test":{
        "msee": 11976.16796875,
        "r2": -0.8027065992355347,
        "std": 109.59520721435547,
        "avg": -2.3448710441589355,
        "min": -386.17926025390625,
        "max": 405.26837158203125,
        "out_file": "test.png"
    }
}

我的方法是创建一个字典并打印:

var dict = JsonConvert.DeserializeObject<Dictionary<string, Models.ResultData>>(content);

foreach (var x in dict)
{
    Console.WriteLine($"{x.Key}: {x.Value}");
}

这会输出类似

的内容
train: 0.0001160421  1...
test: 11976.168  -0.8027066 ...

我的问题是如何对我的初始版本代码执行类似的方法,以便它首先获取字典中 train 的 JSON,映射它,然后存储 1 行 AND然后它将采用第二个嵌套 JSON test,相应地再次映射数据并另存为另一行。

你可以这样做:

var dict = JsonConvert.DeserializeObject<Dictionary<string, Models.ResultData>>(content);

foreach (var x in dict)
{
    Console.WriteLine($"{x.Key}: {x.Value}");
    _dataContext.ResultData.Add(x.Value.ToData());
}

await _dbContext.SaveChangesAsync();