如何使用 IConfiguration 对象访问作为其他键的父项的键的值?
How to access value of a key which is parent of other keys using IConfiguration object?
我有以下配置 json 文件:
{
"key1": false,
"key2": "hello world",
"key3": {
"f1_somekey": true,
"f2_somekey": true,
"f3_cachekey": [
{
"s": 1,
"p": [4, 6, 7, 8, 9]
},
{
"s": 2,
"p": [5]
},
{
"p": [10, 11, 12, 13, 14]
}
]
}
}
我正在尝试从 IConfiguration 对象获取每个键值,但我对如何获取 f3_cachekey
的值感到困惑?我可以提取所有其他键值,但在 f3_cachekey
.
上混淆
var key1Value = Configuration["key1"];
var key2Value = Configuration["key2"];
var key3_f1Value = Configuration["key3:f1_somekey"];
var key3_f2Value = Configuration["key3:f2_somekey"];
我需要制作一个整数字典作为 key
和整数 HashSet 作为 f3_cachekey
的 value
。
Dictionary<int, HashSet<int>> sToPMapping = new Dictionary<int, HashSet<int>>();
我在f3_cachekey
有两个案例:
- 我有
s
和 p's
数组的组合。在上面的示例中 - f3_cachekey
. 的第一个和第二个 json 对象
- 其次是我只有
p's
数组,这是第三个 json 对象。对于这种情况,我确实有一些预定义的 s
已经存储在另一个 HashSet
中,我将使用它作为键,它们的每个 s
值都将是所有这些 p's
。
这可以吗?此外,如果 f3_cachekey
不存在于上述 json 中,那么我需要创建空字典对象。
配置 Microsoft.Extensions.Configuration 实际上是一个平面 key-value 映射。只是 JSON 配置源允许您将配置指定为层次结构。加载文件后,层次结构将被扁平化为直接键到值映射,其中键是 配置路径 .
对于您的特定 JSON 示例,配置中提供了以下映射:
key1 => false
key2 => hello
key3:f1_somekey => true
key3:f2_somekey => true
key3:f3_cachekey:0:s => 1
key3:f3_cachekey:0:p:0 => 4
key3:f3_cachekey:0:p:1 => 6
key3:f3_cachekey:0:p:2 => 7
key3:f3_cachekey:0:p:3 => 8
key3:f3_cachekey:0:p:4 => 9
key3:f3_cachekey:1:s => 2
key3:f3_cachekey:1:p:0 => 5
key3:f3_cachekey:2:p:0 => 10
key3:f3_cachekey:2:p:1 => 11
key3:f3_cachekey:2:p:2 => 12
key3:f3_cachekey:2:p:3 => 13
key3:f3_cachekey:2:p:4 => 14
正如您希望从中看到的那样,配置对象中没有数组或对象。它只是 :
分隔部分和单个值的路径。数组值通过在路径中包含数组索引来标识,例如f3_cachekey:0
第一个元素。
这种结构使得支持各种配置源变得非常简单,因为它们都可以创建这样的 key-value 映射,甚至是像环境变量这样简单的东西。但是这种结构也使得使用 non-trivial 值的配置有点困难。为此,配置框架中有 binder 部分。
如果仔细查看上面的列表,您会发现没有 key3:f3_cachekey
条目,也没有 key3:f3_cachekey:0
或 key3:f3_cachekey:0:p
条目。那是因为在这些键处,没有值本身,而是其他嵌套结构、对象或数组。在配置框架中,这些被称为 sections ,这基本上只是一种谈论路径子集的方式。例如,键为 key3:f3_cachekey:0
的部分如下所示:
s => 1
p:0 => 4
p:1 => 6
p:2 => 7
p:3 => 8
p:4 => 9
您可以将整个配置或配置部分绑定到类型对象,例如数组和列表,甚至嵌套的 C# 对象。这在组合配置与 the options pattern 时被大量使用。您也可以手动调用绑定过程:
使用上述配置,例如,您可以通过检索该路径的 配置部分 并将其绑定到一个 int 数组来访问 key3:f3_cachekey:0:p
的数组:
int[] values = configuration.GetSection("key3:f3_cachekey:0:p").Get<int[]>();
您可以使用它来类似地检索其他值。或者您可以定义一个与您的 JSON 结构相匹配的完整类型并将其绑定到该对象类型:
CacheKeySP[] values = configuration.GetSection("key3:f3_cachekey").Get<CacheKeySP[]>();
这里假定 class 定义如下:
public class CacheKeySP
{
public int S { get; set; }
public int[] P { get; set; }
}
我有以下配置 json 文件:
{
"key1": false,
"key2": "hello world",
"key3": {
"f1_somekey": true,
"f2_somekey": true,
"f3_cachekey": [
{
"s": 1,
"p": [4, 6, 7, 8, 9]
},
{
"s": 2,
"p": [5]
},
{
"p": [10, 11, 12, 13, 14]
}
]
}
}
我正在尝试从 IConfiguration 对象获取每个键值,但我对如何获取 f3_cachekey
的值感到困惑?我可以提取所有其他键值,但在 f3_cachekey
.
var key1Value = Configuration["key1"];
var key2Value = Configuration["key2"];
var key3_f1Value = Configuration["key3:f1_somekey"];
var key3_f2Value = Configuration["key3:f2_somekey"];
我需要制作一个整数字典作为 key
和整数 HashSet 作为 f3_cachekey
的 value
。
Dictionary<int, HashSet<int>> sToPMapping = new Dictionary<int, HashSet<int>>();
我在f3_cachekey
有两个案例:
- 我有
s
和p's
数组的组合。在上面的示例中 -f3_cachekey
. 的第一个和第二个 json 对象
- 其次是我只有
p's
数组,这是第三个 json 对象。对于这种情况,我确实有一些预定义的s
已经存储在另一个HashSet
中,我将使用它作为键,它们的每个s
值都将是所有这些p's
。
这可以吗?此外,如果 f3_cachekey
不存在于上述 json 中,那么我需要创建空字典对象。
配置 Microsoft.Extensions.Configuration 实际上是一个平面 key-value 映射。只是 JSON 配置源允许您将配置指定为层次结构。加载文件后,层次结构将被扁平化为直接键到值映射,其中键是 配置路径 .
对于您的特定 JSON 示例,配置中提供了以下映射:
key1 => false
key2 => hello
key3:f1_somekey => true
key3:f2_somekey => true
key3:f3_cachekey:0:s => 1
key3:f3_cachekey:0:p:0 => 4
key3:f3_cachekey:0:p:1 => 6
key3:f3_cachekey:0:p:2 => 7
key3:f3_cachekey:0:p:3 => 8
key3:f3_cachekey:0:p:4 => 9
key3:f3_cachekey:1:s => 2
key3:f3_cachekey:1:p:0 => 5
key3:f3_cachekey:2:p:0 => 10
key3:f3_cachekey:2:p:1 => 11
key3:f3_cachekey:2:p:2 => 12
key3:f3_cachekey:2:p:3 => 13
key3:f3_cachekey:2:p:4 => 14
正如您希望从中看到的那样,配置对象中没有数组或对象。它只是 :
分隔部分和单个值的路径。数组值通过在路径中包含数组索引来标识,例如f3_cachekey:0
第一个元素。
这种结构使得支持各种配置源变得非常简单,因为它们都可以创建这样的 key-value 映射,甚至是像环境变量这样简单的东西。但是这种结构也使得使用 non-trivial 值的配置有点困难。为此,配置框架中有 binder 部分。
如果仔细查看上面的列表,您会发现没有 key3:f3_cachekey
条目,也没有 key3:f3_cachekey:0
或 key3:f3_cachekey:0:p
条目。那是因为在这些键处,没有值本身,而是其他嵌套结构、对象或数组。在配置框架中,这些被称为 sections ,这基本上只是一种谈论路径子集的方式。例如,键为 key3:f3_cachekey:0
的部分如下所示:
s => 1
p:0 => 4
p:1 => 6
p:2 => 7
p:3 => 8
p:4 => 9
您可以将整个配置或配置部分绑定到类型对象,例如数组和列表,甚至嵌套的 C# 对象。这在组合配置与 the options pattern 时被大量使用。您也可以手动调用绑定过程:
使用上述配置,例如,您可以通过检索该路径的 配置部分 并将其绑定到一个 int 数组来访问 key3:f3_cachekey:0:p
的数组:
int[] values = configuration.GetSection("key3:f3_cachekey:0:p").Get<int[]>();
您可以使用它来类似地检索其他值。或者您可以定义一个与您的 JSON 结构相匹配的完整类型并将其绑定到该对象类型:
CacheKeySP[] values = configuration.GetSection("key3:f3_cachekey").Get<CacheKeySP[]>();
这里假定 class 定义如下:
public class CacheKeySP
{
public int S { get; set; }
public int[] P { get; set; }
}