Необходимо сериализовать и десериализовать словари C # в массив JSON.Я также хотел бы прочитать JSON из powershell, используя индексную запись массива.
По умолчанию формат JSON:
{
"defaultSettings": {
"applications": {
"Apollo": {
"environments": {
"DEV": {
"dbKeyTypes": {
"DmkPassword": "AEikOooIuGxXC9UBJQ3ckDj7Q126tB06",
"SymmetricKeySource": "bTU7XOAYA2FFifmiBUggu99yHxX3Ftds"
}
},
"TST": {
"dbKeyTypes": {
"DmkPassword": "AEikOooIuGxXC9UBJQ3ckDj7Q126tB06",
"SymmetricKeySource": "bTU7XOAYA2FFifmiBUggu99yHxX3Ftds"
}
}
}
},
"Gemini": {
"environments": {
"DEV": {
"dbKeyTypes": {
"DmkPassword": "AEikOooIuGxXC9UBJQ3ckDj7Q126tB06",
"SymmetricKeySource": "bTU7XOAYA2FFifmiBUggu99yHxX3Ftds"
}
},
"TST": {
"dbKeyTypes": {
"DmkPassword": "AEikOooIuGxXC9UBJQ3ckDj7Q126tB06",
"SymmetricKeySource": "bTU7XOAYA2FFifmiBUggu99yHxX3Ftds"
}
}
}
}
}
}
}
Это прекрасно работает при использовании программы чтения json по умолчанию в .Net Core,но это не позволяет мне использовать обозначение индекса массива в PowerShell.
Вместо этого я ищу следующее:
{
"defaultSettings": {
"applications": [
{
"Apollo": {
"environments": [
{
"DEV": {
"dbKeyTypes": [
{
"DmkPassword": "AEikOooIuGxXC9UBJQ3ckDj7Q126tB06"
},
{
"SymmetricKeySource": "bTU7XOAYA2FFifmiBUggu99yHxX3Ftds"
}
]
}
},
{
"TST": {
"dbKeyTypes": [
{
"DmkPassword": "AEikOooIuGxXC9UBJQ3ckDj7Q126tB06"
},
{
"SymmetricKeySource": "bTU7XOAYA2FFifmiBUggu99yHxX3Ftds"
}
]
}
}
]
}
},
{
"Gemini": {
"environments": [
{
"DEV": {
"dbKeyTypes": [
{
"DmkPassword": "AEikOooIuGxXC9UBJQ3ckDj7Q126tB06"
},
{
"SymmetricKeySource": "bTU7XOAYA2FFifmiBUggu99yHxX3Ftds"
}
]
}
},
{
"TST": {
"dbKeyTypes": [
{
"DmkPassword": "AEikOooIuGxXC9UBJQ3ckDj7Q126tB06"
},
{
"SymmetricKeySource": "bTU7XOAYA2FFifmiBUggu99yHxX3Ftds"
}
]
}
}
]
}
}
]
}
}
Я использую часть WriteJson из Сериализующий словарьв массив "name": "value"
Это хорошо работает;однако, конечно, поскольку метод ReadJson()
не реализован, он не читает.Кстати, чтобы получить вышеуказанный желаемый формат json, я изменил CustomDictionaryConverter в ссылке:
writer.WritePropertyName(key.ToString());
//writer.WriteValue(key);
//writer.WritePropertyName("value");
serializer.Serialize(writer, valueEnumerator.Current);
Классы, стоящие за реализацией:
public enum DeploymentEnvironment { DEV = 1, TST = 2 }
public enum TargetApplication { Apollo = 1, Gemini = 2 }
public enum DbKeyType { DmkPassword = 1, SymmetricKeySource = 2 }
public class DeploymentSettings
{
[JsonProperty("defaultSettings")]
public DefaultSettings DefaultSettings { get; set; }
public DeploymentSettings()
{
DefaultSettings = new DefaultSettings();
}
}
public partial class DefaultSettings
{
[JsonProperty("applications")]
public Dictionary<TargetApplication, ApplicationContainer> Applications { get; set; }
public DefaultSettings()
{
Applications = new Dictionary<TargetApplication, ApplicationContainer>();
}
}
public partial class ApplicationContainer
{
[JsonProperty("environments")]
public Dictionary<DeploymentEnvironment, EnvironmentContainer> Environments { get; set; }
public ApplicationContainer()
{
Environments = new Dictionary<DeploymentEnvironment, EnvironmentContainer>();
}
}
public partial class EnvironmentContainer
{
[JsonProperty("dbKeyTypes")]
public Dictionary<DbKeyType, string> DbKeyTypes { get; set; }
public EnvironmentContainer()
{
DbKeyTypes = new Dictionary<DbKeyType, string>();
}
}
Я сериализую объектследующим образом: var json = JsonConvert.SerializeObject(ds, Formatting.Indented, new CustomDictionaryConverter());
Как уже упоминалось, сериализация работает, но мне нужна помощь в написании метода ReadJson()
для возможности десериализации.