如何在Azure函数中设置local.settings.json文件中的数组值

c9qzyr3d  于 2023-08-07  发布在  其他
关注(0)|答案(7)|浏览(120)

当我尝试插入一个数组作为local.settings.json文件中的一个值时:

{
  "IsEncrypted": false,
  "Values": {
    "AzureWebJobsStorage": "",
    "AzureWebJobsDashboard": "",
    "myArray": [
      {
        "key1": "value1",
        "key2": "value2"
      },
      {
        "key1": "value3",
        "key2": "value4"
      }
    ]
  },
  "ConnectionStrings": {
    "SQLConnectionString": "myConnectionString"
  }
}

字符串
我开始得到例外。local.settings.json文件中可以使用数组吗?如果可以,正确的格式是什么?

pw9qyyiw

pw9qyyiw1#

需要使用数组索引器格式。
例如:

"myArray:[0]:key1": "value1",
"myArray:[0]:key2": "value2",
"myArray:[1]:key1": "value3",
"myArray:[1]:key2": "value4"

字符串

gab6jxml

gab6jxml2#

这现在是可能的!
我的本地设置文件如下所示:

{
  "IsEncrypted": false,
  "Values": {
    "AzureWebJobsStorage": "UseDevelopmentStorage=true"
  },
  "CustomArray": [
    {
      "CustomProp1": "foo0",
      "CustomProp2": "bar0"
    },
    {
      "CustomProp1": "foo1",
      "CustomProp2": "bar1"
    }
  ]
}

字符串
部署到Azure时,我的配置看起来像这样:x1c 0d1x的数据
然后,为了在我的启动中解析数组,我有这样的东西:

var settings = new List<CustomSetting>();
config.GetSection("CustomArray").Bind(settings);


...其中CustomSetting是这样的类:

public class CustomSetting 
{
    public string CustomProp1 { get; set; }
    public string CustomProp2 { get; set; }
}


我正在使用Microsoft.Extensions.Configuration Nuget包的3.1.5版本和Microsoft.NET.Sdk.Functions Azure Functions SDK的3.0.7版本。

mwg9r5ms

mwg9r5ms3#

如果您尝试在local.settings.json文件/环境变量中设置数组,则可以指定以下格式:

{
  "IsEncrypted": false,
  "Values": {
    "AzureWebJobsStorage": "UseDevelopmentStorage=true",
    "FUNCTIONS_WORKER_RUNTIME": "dotnet",
    "MyArray:0:Name": "Test",
    "MyArray:1:Name": "Test2",
    "MyArray:2:Name": "Test3"
  }
}

字符串
在Startup.cs中,可以使用以下语法绑定数组

var settings = new List<MyArrayType>();
configuration.GetSection("MyArray").Bind(settings);


这是一个使用.NET 6.0和Azure Functions v4的示例

93ze6v8z

93ze6v8z4#

在local.settings.json文件中添加类似数组的字符串:

"myArray": "[
             {
               \"key1\": \"value1\",
               \"key2\": \"value2\"
             },
             {
               \"key1\": \"value3\",
               \"key2\": \"value4\"
             }
            ]"

字符串
然后在代码中反序列化它,如下所示:

string value = Environment.GetEnvironmentVariable("myArray");

objList = JsonConvert.DeserializeObject<List<object>>(value);

bfnvny8b

bfnvny8b5#

可以在local.settings.json文件中使用数组吗?如果可以,正确的格式是什么?
local.settings.json目前似乎不支持arrarys
据我所知,Values集合应该是一个Dictionary,如果其中包含任何非字符串值,将导致Azure函数无法从local.settings.json读取值
根据我的测试,如果它包含它将返回null

"myArray": [
      {
        "key1": "value1",
        "key2": "value2"
      },
      {
        "key1": "value3",
        "key2": "value4"
      }
    ]

字符串


的数据

slmsl1lt

slmsl1lt6#

我找到了一个解决方案,但不会使其复杂化,您可以简单地创建一个数组,如下所示,它在Azure Functions中的local.settings.json文件中完美工作-

"myArray": "[\"Value1\",\"Value2\"]"

字符串

wlsrxk51

wlsrxk517#

对于简单数组,这里已经有了一些很好的答案,但是我想添加一些与复杂对象相关的细节,以防有人遇到需要一个包含嵌套对象的数组的“完整示例”。简而言之,数组可以像下面这样引用。下面是一个包含简单字符串“Name”属性的2个租约的数组。此外,数组索引似乎可以使用或不使用方括号。我添加方括号是因为它更清楚地表明这是一个数组项。

"Values": {
    "Leases:[0]:Name": "Lease1",
    "Leases:[1]:Name": "Lease2"
}

字符串
但在我的例子中,我也有复杂的嵌套配置对象,而不仅仅是简单的原语。这方面的约定是在对象和它的属性之间加双下划线,它们可以嵌套多个层次。例如,我有一个Lease对象数组,每个对象都有一个复杂的RateLimit属性,而RateLimit属性又有一个复杂的FixedWindow属性,如下所示:

public class LeaseOptions
{
    public string? Name { get; init; }
    public RateLimitOptions? RateLimit { get; init; }
}

public class RateLimitOptions
{
    public int PermitLimit { get; init; } = 10;
    public FixedWindowOptions? FixedWindow { get; init; }
}

public class FixedWindowOptions
{
    public int PermitLimit { get; init; }
    public TimeSpan Window { get; init; }
}


我的配置看起来像这样:

"Values": {
    "Leases:[0]:Name": "Lease1",
    "Leases:[0]:RateLimit__PermitLimit": 10,
    "Leases:[0]:RateLimit__FixedWindow__PermitLimit": 500,
    "Leases:[0]:RateLimit__FixedWindow__Window": "0:0:1:0",
    "Leases:[1]:Name": "Lease2",
    "Leases:[1]:RateLimit__PermitLimit": 1
    "Leases:[1]:RateLimit__FixedWindow__PermitLimit": 100,
    "Leases:[2]:RateLimit__FixedWindow__Window": "0:0:5:0"
}


加载配置就像从config中绑定一个基本列表一样简单:

var leaseOptions = new List<LeaseOptions>();
 configuration.GetSection("Leases").Bind(leaseOptions);

相关问题