将 Json 转换为 Poco 集合/如何编写 For Each?

2024-02-28

我对 Azure Functions 还很陌生。

我创建了一个 C# WebHook / Azure 函数(我想这是正确的事情)来获取我的 json 内容并将其转换为简单的 poco/dto 对象的集合。

public static class GenericWebHookCSharp
{
    [FunctionName("GenericWebHookCsharpOne")]
    public static async Task<HttpResponseMessage /* object */> Run([HttpTrigger(WebHookType = "genericJson")]HttpRequestMessage req, TraceWriter log)
    {
        try
        {

            log.Info(string.Format("C# GenericWebHookCsharpOne about to process a request. ('{0}')", DateTime.Now.ToLongTimeString()));

            //IUnityContainer container = new UnityContainer();
            //container.RegisterType<IJsonToPersonRequestWrapperConverter, JsonToPersonRequestWrapperConverter>();
            //IJsonToPersonRequestWrapperConverter jsonConvtr = container.Resolve<IJsonToPersonRequestWrapperConverter>();
            //ICollection<Person> emps = await jsonConvtr.ConvertHttpRequestMessageToPersonCollection(req);

            /* above commented code is my "real" code where I  take the INPUT request-body-as-json and convert it into a ICollection of Person(s) */
            /* below code, I just fake-creating some persons */
            string jsonContent = await req.Content.ReadAsStringAsync();
            ICollection<Person> persons = new List<Person>();
            for(int i = 0; i< 10; i++)
            {
                persons.Add(new Person() { PersonUuid = Guid.NewGuid(), LastName = "LN" + i.ToString(), FirstName = "FN" + i.ToString(), BirthDate = DateTimeOffset.Now.AddYears(-1 * (20 + i))});
            }

            string serializedJson = Newtonsoft.Json.JsonConvert.SerializeObject(persons);

            log.Info(string.Format("C# GenericWebHookCsharpOne finished a request. ('{0}')", DateTime.Now.ToLongTimeString()));

            return req.CreateResponse(HttpStatusCode.OK , serializedJson);

        }
        catch (Exception ex)
        {
            string errorMsg = ex.Message;// ExceptionHelper.GenerateFullFlatMessage(ex);
            log.Error(errorMsg);
            return req.CreateResponse(HttpStatusCode.BadRequest, errorMsg);
        }
    }
}

在另一个 .cs 文件中

public class Person
{

    public Guid PersonUuid { get; set; }

    public string LastName { get; set; }

    public string FirstName { get; set; }

    public DateTimeOffset? BirthDate { get; set; }
}

如果我在 Visual Studio 中调试它,它工作正常。

所以我将其添加为我的逻辑应用程序中的一个步骤,如下所示

所以我想添加一个新步骤,即“针对每个”步骤。这是我现在得到的:(下图)。我看到的只是初始触发器中的“body”和“convert”webhook 函数(我上面有)........

如何让“人”(这样我可以为每个人做一个)集合显示出来并可用于逻辑应用程序的下一步?

编辑/追加:

最终的游戏是为我的“每个”人推送一条服务总线消息。

根据要求,这里是“person json”......

[{
    "PersonUuid": "7ec8cc4d-831c-4c89-8516-47424ee2658d",
    "LastName": "LN0",
    "FirstName": "FN0",
    "BirthDate": "1997-08-17T09:46:16.9839382-04:00"
},
{
    "PersonUuid": "275264bc-5a86-476d-a189-512afa1e3ce4",
    "LastName": "LN1",
    "FirstName": "FN1",
    "BirthDate": "1996-08-17T09:46:16.9844385-04:00"
},
{
    "PersonUuid": "e522b827-2d2e-465d-a30a-c4b619d2e8e4",
    "LastName": "LN2",
    "FirstName": "FN2",
    "BirthDate": "1995-08-17T09:46:16.9844385-04:00"
},
{
    "PersonUuid": "f16bce36-3491-4519-bc82-580939f61b2e",
    "LastName": "LN3",
    "FirstName": "FN3",
    "BirthDate": "1994-08-17T09:46:16.9844385-04:00"
},
{
    "PersonUuid": "42456057-39ef-45aa-bd7c-ad6a8fa74fd1",
    "LastName": "LN4",
    "FirstName": "FN4",
    "BirthDate": "1993-08-17T09:46:16.9844385-04:00"
},
{
    "PersonUuid": "14088a6e-3c44-4cb0-927d-19f5eda279c4",
    "LastName": "LN5",
    "FirstName": "FN5",
    "BirthDate": "1992-08-17T09:46:16.9844385-04:00"
},
{
    "PersonUuid": "332a5cde-3cd1-467a-9dfc-2b187d6ae32e",
    "LastName": "LN6",
    "FirstName": "FN6",
    "BirthDate": "1991-08-17T09:46:16.9844385-04:00"
},
{
    "PersonUuid": "6debe134-19e6-4b16-a91d-05ded511eff6",
    "LastName": "LN7",
    "FirstName": "FN7",
    "BirthDate": "1990-08-17T09:46:16.9844385-04:00"
},
{
    "PersonUuid": "e61ef8a1-09d3-4c5b-b948-df8e0858cd29",
    "LastName": "LN8",
    "FirstName": "FN8",
    "BirthDate": "1989-08-17T09:46:16.9844385-04:00"
},
{
    "PersonUuid": "e9b27632-d3a4-4fe8-8745-04edfa8854f7",
    "LastName": "LN9",
    "FirstName": "FN9",
    "BirthDate": "1988-08-17T09:46:16.9844385-04:00"
}]

Ok.

我必须在忘记之前把它写下来。哇,真是一次美妙的旅程。

首先是 WebHook 上的 C# 代码。请注意“anonymousPersonWrapper”代码。

public static class GenericWebHookCSharp
{
    [FunctionName("GenericWebHookCsharpOne")]
    public static async Task<HttpResponseMessage /* object */> Run([HttpTrigger(WebHookType = "genericJson")]HttpRequestMessage req, TraceWriter log)
    {
        try
        {

            log.Info(string.Format("C# GenericWebHookCsharpOne about to process a request. ('{0}')", DateTime.Now.ToLongTimeString()));

            ///////* below code, I just fake-creating some persons */
            string jsonContent = await req.Content.ReadAsStringAsync();
            ICollection<Person> persons = new List<Person>();
            for (int i = 0; i < 3; i++)
            {
                persons.Add(new Person() { PersonUuid = Guid.NewGuid(), LastName = "LN" + i.ToString(), FirstName = "FN" + i.ToString(), BirthDate = DateTimeOffset.Now.AddYears(-1 * (20 + i)) });
            }

            /* the below is the "trick" to allow the for-each to work in the Logic-App.  at least in my experience */
            var anonymousPersonWrapper = new
            {
                personWrapper = persons
            };

            string personWrapperJsonString = JsonConvert.SerializeObject(anonymousPersonWrapper);

            log.Info(string.Format("C# GenericWebHookCsharpOne finished a request. ('{0}')", DateTime.Now.ToLongTimeString()));
            HttpResponseMessage returnReq = req.CreateResponse(HttpStatusCode.OK , personWrapperJsonString );
            return returnReq;

        }
        catch (Exception ex)
        {
            string errorMsg = ex.Message;
            log.Error(errorMsg);
            return req.CreateResponse(HttpStatusCode.BadRequest, errorMsg);
        }
    }
}

但是在“return returnReq;”上放置一个断点,我可以看到 personWrapperJsonString 包含以下 Json:

{
    "personWrapper": [{
        "PersonUuid": "31fb318d-a9bf-4c2f-ad16-0810ddd73746",
        "LastName": "LN0",
        "FirstName": "FN0",
        "BirthDate": "1997-08-17T15:10:08.9633612-04:00"
    },
    {
        "PersonUuid": "73fdacc7-e1e8-48ff-b161-1bd8b5f4aec1",
        "LastName": "LN1",
        "FirstName": "FN1",
        "BirthDate": "1996-08-17T15:10:08.9633612-04:00"
    },
    {
        "PersonUuid": "d18b4324-2d3e-41ca-9525-fe769af89e9c",
        "LastName": "LN2",
        "FirstName": "FN2",
        "BirthDate": "1995-08-17T15:10:08.9633612-04:00"
    }]
}

Ok.

然后我添加了一个“Parse Json”操作(下图)

然后我设置 Parse-Json。以下。

上面的 parse-json 设置并不完整。

单击“使用示例有效负载生成架构”按钮,将弹出一个新窗口。粘贴之前的“personWrapper”json。如下图所示。

上面的内容当然会创建您需要的 json 模式(即 for-each 友好)。如下所示。

现在我们已经很接近了。

添加 For-Each(添加新步骤时使用“更多”按钮)(如下所示)

现在我们设置 for-each。看看出现了什么! “personWrapper”(下图)

为了一笑,我将会话 Id 设置为 Person Uuid 值(只是为了表明我可以获取对象的标量属性之一。(下图)。

现在 json 作为服务总线消息的内容。 (下图)

然后,我发布了 Azure-Functions 并部署了逻辑应用程序,并向触发器发送了请求。

返回天蓝色门户。 PersonUuid 显示为 SessionId! (下图)

并在 Service Bus Explorer 中快速检查以“查看”消息的内容(下图)

好吧,一些面包屑:

我从这里得到了关于将集合侧作为“包装器”的提示。

Json.NET 根据架构验证 JSON 数组 https://stackoverflow.com/questions/42190942/json-net-validate-json-array-against-schema/42192405#42192405

我一路上遇到的一些错误

“类型无效。需要对象,但得到的是数组。”

UnsupportedMediaType“WebHook 请求必须包含格式为 JSON 的实体正文。”

“此输出是一个数组”“一个 foreach 不能嵌套在另一个 foreach 中”

“Json”期望其参数是字符串或 XML。提供的值是“Array”类型。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将 Json 转换为 Poco 集合/如何编写 For Each? 的相关文章

随机推荐

  • 什么是“HDFS 写入管道”?

    当我阅读 hadoop 权威指南时 我坚持以下句子 写入reduce输出确实会消耗网络带宽 但仅作为 与普通 HDFS 写入管道消耗的量差不多 问题 1 能帮我更详细地理解上面这句话吗 2 HDFS写入管道 是什么意思 当文件写入 HDFS
  • Python 为 S3 Post 生成签名

    我想我已经阅读了几乎所有有关浏览器内基于表单的 S3 签名的 Base 64 编码的内容 旧文档和新文档 例如 http doc s3 amazonaws com proposals post html http doc s3 amazon
  • 如何在Python中读取fasta文件?

    我正在尝试读取 FASTA 文件 然后找到特定的主题 字符串 https en wikipedia org wiki Sequence motif并打印出它发生的顺序和次数 AFASTA文件 https en wikipedia org w
  • 如何使用 Ajax 使用 VS 2012 Internet 模板更新 RenderBody() 部分?

    我看过一些 Ajax 可用于更新 div 或其他具有 id 元素的示例 我无法找到使用 Ajax 和 Razor 视图的示例来帮助我完成以下任务 我的页面是顶部的标准菜单 中间的正文和页脚 并不需要每次都更新页眉和页脚 事实上 我的页面只需
  • SyncConfiguration 已弃用,SyncUser.configuration() 的正确用法是什么?

    我开始从 Realm 收到以下警告 init user realmURL enableSSLValidation isPartial urlPrefix 已弃用 使用 SyncUser configuration 代替 我明白警告的意思 但
  • Elasticsearch 中的 PIT 成本如何?

    我知道scrollElasticsearch 有很多开销 而且search after一般是首选 但是 PIT 时间点 呢 它也有相同的开销吗 Is search after仍然比 PIT 快吗 Since 个人所得税杠杆search af
  • NetBeans Android 插件出错

    我目前正在开发一个 Android 应用程序 并且使用 Netbeans 6 9 1 和 nbandroid 1 0 beta 我已经安装了 Android SDK 并配置了所有内容 但是当我创建一个简单的项目并尝试构建它时出现错误 Cre
  • 如何丢弃在睡眠功能期间传递的用户输入?

    我正在尝试使用终端创建游戏 我询问玩家是否准备好 然后使用下面的代码进行倒计时 问题在于用户所做的所有输入都会添加到程序所做的下一个输入查询中 我正在寻找一种方法来丢弃以前的输入或在此函数期间完全阻止它 我可以做一个 getchar 循环
  • 使用 python 连接字节列表

    我正在尝试开发一个工具来读取二进制文件 进行一些更改并保存它 我想做的是列出文件中的每一行 处理几行 然后再次加入该列表 这是我尝试过的 file open myFile exe r b aList for line in f aList
  • php mysqli 准备语句选择

    尝试让一个函数能够为任何表创建带有多个参数的简单 CRUD 选择 我认为我已经完成了最难的部分 但现在无法获取数据 也许我做错了什么我无法弄清楚 我准备好的语句函数 function prepared query mysqli sql pa
  • emacs 不备份 git repo 中的文件

    emacs不创建文件内的备份git存储库 我希望保存它们 因为我经常依靠它们在将更改提交到git repo 我正在使用xemacs直到最近 它总是会创建通常的 第一次保存时的文件 但emacs如果在 a 内工作则不会执行此操作git项目 在
  • 从 jenkins 运行 selenium testNG 时,chrome 不会最大化

    我在跑步时遇到问题 硒测试NG 来自 jenkins 的测试 问题是我正在登录我的应用程序并检查一些元素可见性 当我直接从批处理文件运行测试时 我取得了成功 因为我将我的 google chrome 驱动程序设置为最大化使用 driver
  • 如何使用整理器按属性排序? (爪哇)

    我使用Java 我想使用 Collat or 按属性对对象的子列表进行排序 以便按字母顺序排序但忽略重音符号 问题是我尝试了不同的方法 但没有任何效果 这会对子列表进行排序 但不会忽略重音符号 newList subList 0 5 sor
  • Mapfile 作为 MapReduce 作业的输入

    我最近开始使用 Hadoop 在使用 Mapfile 作为 MapReduce 作业的输入时遇到问题 以下工作代码在 hdfs 中编写一个名为 TestMap 的简单 MapFile 其中包含三个 Text 类型的键和三个 BytesWri
  • Gradle 5 和 IntelliJ 2018.3。无法识别的选项:--add-opens 或 java.base.java.lang=ALL-UNNAMED

    我有一组由 Gradle 4 10 3 构建的复杂项目 我可以从命令行构建它们 但也可以将它们导入 IntelliJ 2018 3 Ultimate 不会出现重大问题 当我将 Gradle 升级到 5 1 1 时 项目仍然可以从控制台正常构
  • Perl Windows IPv6

    我有一个使用 TCP IP 套接字的 Perl Windows 应用程序 我需要添加 IPv6 支持 我有一台 Windows 7 64 位计算机 它运行带有 Hurricane Electric 隧道的 IPv6 它的得分为 10 分 满
  • 如何在 Github 中为 Makefile 保留选项卡

    Github 自动将制表符转换为多个空格 所以 每次我创建一个Makefile在 Github 中 我需要在我的 Linux 盒子中克隆存储库并编辑Makefile using vim进而push将更改返回到我的 Github 存储库以避免
  • 具有透明背景的 JavaFX 按钮

    我有一些经典Button在 JavaFX 中 带有一个包含一些文本的框 我需要没有那个框的按钮 只需要文本 当我悬停按钮或用鼠标单击按钮时 它会将其颜色更改为不同的颜色 在 JavaFX 中 样式是通过使用 CSS 来完成的 button
  • 使用 D3.js 在曲线类型之间转换

    我想使用 D3 js 在曲线类型之间进行转换 看一眼这个街区 https bl ocks org iaindillingham 67835c954c5e3a1fd00eed35a0b37765 数据保持不变 但曲线类型发生变化 我原以为路径
  • 将 Json 转换为 Poco 集合/如何编写 For Each?

    我对 Azure Functions 还很陌生 我创建了一个 C WebHook Azure 函数 我想这是正确的事情 来获取我的 json 内容并将其转换为简单的 poco dto 对象的集合 public static class Ge