首页 > 解决方案 > 反序列化嵌套 JSON,映射到模型并保存

问题描述

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

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

然后我上课了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 行,然后使用第二个嵌套 JSON test,相应地再次映射数据并另存为另一行。

标签: c#jsondictionarydeserialization

解决方案


你可以这样做:

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();

推荐阅读