我需要根据项目值将一组对象合并为一个对象 这个想法或多或少是这样的: 我有这个C#方法
private SecurityResponse mergeSecuritySettings(SecurityResponse[] profileDetails)
{
// return merged object
}
其中 SecurityResponse[] 是一组安全配置文件,每个配置文件对于数组中的每一项都有自己的安全设置 例如:
[
{
"colorSettings": [
{
"settingKey": "A_288",
"securitySettingValue": "R"
},
{
"settingKey": "A_288_556",
"securitySettingValue": "R"
}
],
"speedSettings": [
{
"settingKey": "L_19",
"securitySettingValue": "R"
},
{
"settingKey": "L_19_38",
"securitySettingValue": "H"
}
],
"shapeSettings": [
{
"settingKey": "P_8",
"securitySettingValue": "W"
},
{
"settingKey": "P_8_8",
"securitySettingValue": "W"
}
],
"brandSettings": [
{
"settingKey": "R_340",
"securitySettingValue": "R"
},
{
"settingKey": "R_337",
"securitySettingValue": "H"
}
]
},
{
"colorSettings": [
{
"settingKey": "A_288",
"securitySettingValue": "W"
},
{
"settingKey": "A_288_556",
"securitySettingValue": "W"
}
],
"speedSettings": [
{
"settingKey": "L_19",
"securitySettingValue": "R"
},
{
"settingKey": "L_19_38",
"securitySettingValue": "W"
}
],
"shapeSettings": [
{
"settingKey": "P_8",
"securitySettingValue": "W"
},
{
"settingKey": "P_8_8",
"securitySettingValue": "W"
}
],
"brandSettings": [
{
"settingKey": "R_340",
"securitySettingValue": "R"
},
{
"settingKey": "R_337",
"securitySettingValue": "R"
}
]
}
]
这里的关键是“securitySettingValue”(W = Write,R = Read,H = Hide),输出标准应该从最...到最不宽松(注意每个项目都有一个唯一的settingKey)这将在“SecurityResponse”数组的每个元素上重复),
所以...对于他从上面输入的数据,输出应该是:
{
"colorSettings": [
{
"settingKey": "A_288",
"securitySettingValue": "W"
},
{
"settingKey": "A_288_556",
"securitySettingValue": "W"
}
],
"speedSettings": [
{
"settingKey": "L_19",
"securitySettingValue": "R"
},
{
"settingKey": "L_19_38",
"securitySettingValue": "W"
}
],
"shapeSettings": [
{
"settingKey": "P_8",
"securitySettingValue": "W"
},
{
"settingKey": "P_8_8",
"securitySettingValue": "W"
}
],
"brandSettings": [
{
"settingKey": "R_340",
"securitySettingValue": "R"
},
{
"settingKey": "R_337",
"securitySettingValue": "R"
}
]
}
也许解决方案很简单,但如果不进入几个嵌套循环,我就看不到它,(主要是因为我缺乏 C# 知识)。
关于如何处理这个问题有什么建议吗?有内置方法吗?
提前致谢!
尝试这样:
使用
Serialize JSON
和Deserialize JSON
,查看https://www.newtonsoft.com/json
using System;
using System.Collections.Generic;
using Newtonsoft.Json;
public class Program
{
public class BrandSetting
{
public string settingKey { get; set; }
public string securitySettingValue { get; set; }
}
public class ColorSetting
{
public string settingKey { get; set; }
public string securitySettingValue { get; set; }
}
public class ShapeSetting
{
public string settingKey { get; set; }
public string securitySettingValue { get; set; }
}
public class SpeedSetting
{
public string settingKey { get; set; }
public string securitySettingValue { get; set; }
}
public class Root
{
public List<BrandSetting> brandSettings { get; set; }
public List<ColorSetting> colorSettings { get; set; }
public List<ShapeSetting> shapeSettings { get; set; }
public List<SpeedSetting> speedSettings { get; set; }
}
public static void Main()
{
/*
// JSON Serialize
Root root = new Root();
root.brandSettings = new List<BrandSetting>();
BrandSetting brandSetting = new BrandSetting(){
settingKey = "1",
securitySettingValue = "2"
};
root.brandSettings.Add(brandSetting);
root.colorSettings = new List<ColorSetting>();
ColorSetting colorSetting = new ColorSetting(){
settingKey = "3",
securitySettingValue = "4"
};
root.colorSettings.Add(colorSetting);
root.shapeSettings = new List<ShapeSetting>();
ShapeSetting shapeSetting = new ShapeSetting(){
settingKey = "5",
securitySettingValue = "6"
};
root.shapeSettings.Add(shapeSetting);
root.speedSettings = new List<SpeedSetting>();
SpeedSetting speedSetting = new SpeedSetting(){
settingKey = "7",
securitySettingValue = "8"
};
root.speedSettings.Add(speedSetting);
string json = JsonConvert.SerializeObject(root);
json = "[" + json.Replace('\"', '\'') + "]";
Console.WriteLine(json);
Console.WriteLine("");
*/
// json example
String json = @"[{'colorSettings':[{'settingKey':'A_288','securitySettingValue':'R'},{'settingKey':'A_288_556','securitySettingValue':'R'}],'speedSettings':[{'settingKey':'L_19','securitySettingValue':'R'},{'settingKey':'L_19_38','securitySettingValue':'H'}],'shapeSettings':[{'settingKey':'P_8','securitySettingValue':'W'},{'settingKey':'P_8_8','securitySettingValue':'W'}],'brandSettings':[{'settingKey':'R_340','securitySettingValue':'R'},{'settingKey':'R_337','securitySettingValue':'H'}]},{'colorSettings':[{'settingKey':'A_288','securitySettingValue':'W'},{'settingKey':'A_288_556','securitySettingValue':'W'}],'speedSettings':[{'settingKey':'L_19','securitySettingValue':'R'},{'settingKey':'L_19_38','securitySettingValue':'W'}],'shapeSettings':[{'settingKey':'P_8','securitySettingValue':'W'},{'settingKey':'P_8_8','securitySettingValue':'W'}],'brandSettings':[{'settingKey':'R_340','securitySettingValue':'R'},{'settingKey':'R_337','securitySettingValue':'R'}]}]";
// JSON Deserialize
List<Root> SecurityResponses = JsonConvert.DeserializeObject<List<Root>>(json);
//
foreach (Root ro in SecurityResponses)
{
if(ro is null) {
continue;
}
//
foreach (BrandSetting bs in ro.brandSettings)
{
if(bs is null) {
continue;
}
Console.WriteLine("BrandSetting Key: " + bs.settingKey + " BrandSetting Value" + bs.securitySettingValue);
}
}
foreach (Root ro in SecurityResponses)
{
if(ro is null) {
continue;
}
foreach (ColorSetting cs in ro.colorSettings)
{
if(cs is null) {
continue;
}
Console.WriteLine("ColorSetting Key: " + cs.settingKey + " ColorSetting Value" + cs.securitySettingValue);
}
}
foreach (Root ro in SecurityResponses)
{
if(ro is null) {
continue;
}
foreach (ShapeSetting ss in ro.shapeSettings)
{
if(ss is null) {
continue;
}
Console.WriteLine("ShapeSetting Key: " + ss.settingKey + " ShapeSetting Value" + ss.securitySettingValue);
}
}
foreach (Root ro in SecurityResponses)
{
if(ro is null) {
continue;
}
foreach (SpeedSetting spe in ro.speedSettings)
{
if(spe is null) {
continue;
}
Console.WriteLine("SpeedSetting Key: " + spe.settingKey + " SpeedSetting Value" + spe.securitySettingValue);
}
}
}
}