反序列化嵌套 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();
我的初始版本能够获取 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();