【问题标题】:How to get data from a JSON file (filename.json) using Azure functions and C#如何使用 Azure 函数和 C# 从 JSON 文件 (filename.json) 获取数据
【发布时间】:2017-11-22 05:58:20
【问题描述】:

我刚刚创建了一个 Azure 函数,我想通过 Azure Blob 存储触发它(每当创建新的 Blob 时),我想要我的函数代码,以便它解析 Json 文件的内容(filename.json ) 是 JSON 格式,并使用文件的内容来更新数据库的内容,文件的内容如下所示:

{
    "ID": "58",
    "Symbol": "J500",
    "Content": 
      [
        {"Date": "2017-05-15", "Value": "100000"}, 
        {"Date": "2017-05-16", "Value": "200"},
        {"Date": "2017-05-17", "Value": "90000"},
        {"Date": "2017-05-18", "Value": "80000"},
        {"Date": "2017-05-19", "Value": "70000}
      ]
}

我以前几乎没有用 C# 编写过代码,并认为我可以为此使用 python,但事实证明我仅限于 C#,任何关于详细描述和解释的帮助将不胜感激。

我对 Azure 也很陌生,所以如果有人对如何实现我想要做的事情有更好的建议(可能是使用不同的触发器或不同的活页夹,甚至使用不同的服务而不是函数),我愿意接受建议,并很乐意接受。我目前只有默认代码:

public static void Run(Stream myBlob, string name, TraceWriter log)
{
    log.Info($"C# Blob trigger function Processed blob\n Name:{name}" \n Size: {myBlob.Length} Bytes");
}

另外作为旁注,除非我转到监视器屏幕,否则我看不到我的日志,非常感谢任何帮助。

谢谢!

【问题讨论】:

    标签: c# json function azure azure-functions


    【解决方案1】:

    首先,你不能使用 Python 有什么原因吗?对于函数,它是“实验性的”,但主要是出于性能原因。它应该能够完成工作。

    没有用于 blob 的 Python 模板,但如果您创建 QueueTrigger 模板,则可以编辑生成的 function.json 和 python 脚本以使其正常工作。

    function.json:

    {
      "bindings": [
        {
          "name": "input",
          "type": "blobTrigger",
          "direction": "in",
          "path": "samples-python/{fileName}",
          "connection": "AzureWebJobsStorage"
        }
      ],
      "disabled": false
    }
    

    运行.py

    import os
    
    # read the blob contents and write to stdout
    inputMessage = open(os.environ['input']).read()
    message = "Python script processed blob '{0}'".format(inputMessage)
    print(message)
    

    对于 C#,这是一个相当广泛的问题,但我可以为您指明正确的方向。

    首先,您可以使用 Json.NET 处理 .NET 中的 JSON:http://www.newtonsoft.com/json。 Azure Functions 中内置了支持,因此您可以使用此代码将您的 blob 文本转换为 JObject(一种 Json.NET 类型),然后将其记录下来:

    #r "Newtonsoft.Json"
    
    using Newtonsoft.Json.Linq;
    
    public static void Run(string myBlob, string name, TraceWriter log)
    {
        JObject json = JObject.Parse(myBlob);
        log.Info(json.ToString());
    }
    

    从那里,您需要将其导入数据库。如果您使用的是 SQL,这里有一个很好的指南,可以通过 SqlClient 在函数中进行设置:https://docs.microsoft.com/en-us/azure/azure-functions/functions-scenario-database-table-cleanup

    一旦 SqlClient 开始工作,就需要将 JObject 转换为 Sql 记录。下面是一个简单的插入示例:C# - SQLClient - Simplest INSERT

    【讨论】:

    • 感谢您的回答。针对我不能使用 python 的原因,python 的 blob 存储触发器的可能触发器列表中没有选项,只有一个用于 C# 和 F#。此外,我仍然无法让此代码 sn-p 工作,因为我仍然收到编译错误,我认为这是由使用 Newtonsoft.Json 引起的,我是否需要进行任何类型的导入才能使用它提供的方法,因为我的代码和你的几乎一样,但它仍然不起作用。
    • Python 支持 Blob 触发器;他们没有模板。我已经更新了上面的答案,以展示如何从队列触发器开始创建一个。如果您仍想继续 C#,请告诉我,我们可以找出问题所在——该代码应该能够复制粘贴并运行。
    • 谢谢,这很有帮助,而且确实有效,我现在唯一的问题是,每当触发器关闭(即文件加载到 blob 存储)时,该函数都适用于所有文件在那个容器里。你知道我可以用什么方法使函数只对加载的那个 blob(触发函数的 blob)起作用吗?
    • 应用程序第一次运行时,它会处理容器中的所有 blob。之后,它将仅针对新 blob 或对现有 blob 的更改运行。添加新的 blob 时,您是否触摸了容器中的任何其他 blob?
    • 是的,我是在不知不觉中从我的 python 脚本中这样做的!,我猜是菜鸟错误,非常感谢你,你帮了大忙,我也想知道是否有办法访问函数代码中 blob 的元数据。
    猜你喜欢
    • 1970-01-01
    • 2021-08-16
    • 1970-01-01
    • 2021-08-11
    • 2021-01-25
    • 2014-09-06
    • 2018-06-06
    • 2021-11-10
    • 1970-01-01
    相关资源
    最近更新 更多