GVKun编程网logo

从get webhook响应嵌套json创建数组(jsonobject 获取嵌套key)

24

此处将为大家介绍关于从getwebhook响应嵌套json创建数组的详细内容,并且为您解答有关jsonobject获取嵌套key的相关问题,此外,我们还将为您介绍关于.net解析嵌套JSON、adna

此处将为大家介绍关于从get webhook响应嵌套json创建数组的详细内容,并且为您解答有关jsonobject 获取嵌套key的相关问题,此外,我们还将为您介绍关于.net 解析嵌套JSON、adnanh webhook 框架 hook rule、asp.net-mvc-4 – Web API 2返回OK响应,但在后台继续处理、c# – ASP.NET WebAPI 2嵌套JSON的有用信息。

本文目录一览:

从get webhook响应嵌套json创建数组(jsonobject 获取嵌套key)

从get webhook响应嵌套json创建数组(jsonobject 获取嵌套key)

您可能要考虑编写自己的code step,以将嵌套的数据格式化为对象数组(JSON)。然后,您可以将数据返回到output并实现所需的效果,在下一步中,output数组中的每个项目都会执行PUT请求。

以下是Zapier关于此策略的说明:

Setting the output to an array of objects will run the subsequent steps multiple times — once for each object in the array. If Code by Zapier is the Zap's trigger and an empty array is returned,nothing happens. You can think of it like a polling trigger that did not get any results in the HTTP response. This functionality is exclusive to triggers — returning an empty array in a Code by Zapier action does not have the same effect.

.net 解析嵌套JSON

.net 解析嵌套JSON

JSON格式文件如下:我们是要取出msgJsoncontent里面GeneralReportInfo下serviceData中的totalUseValue数据

{
    "responseCode": "100000",
    "message": "运行正确",
    "result": {
        "pageNum": 1,
        "pageSize": 10,
        "size": 10,
        "startRow": 1,
        "endRow": 10,
        "total": 27,
        "pages": 3,
        "list": [{
            "id": "7bcba4b7508a433db7664ec9f60fef2a",
            "registTime": "2019-07-01 23:49:17",
            "updateTime": "2019-07-01 23:49:48",
            "gmId": "9999999000008888",
            "concentratorNum": "",
            "deviceType": "",
            "subdeviceType": "",
            "anysType": 0,
            "port": 0,
            "ip": "",
            "msgJsoncontent": "{\"identifier\":\"9000008888\",\"hasMore\":0,\"mid\":598,\"msgType\":\"deviceReq\",\"data\":[{\"serviceId\":\"GeneralReportInfo\",\"serviceData\":{\"dfCount\":\"0\",\"dfId\":\"0\",\"connType\":\"0\",\"deviceType\":\"2\",\"subDeviceType\":\"12\",\"companyNo\":\"999999\",\"meterType\":\"0000\",\"dataType\":\"00\",\"totalUseValue\":\"7.90\",\"recentFreezeValue\":\"7.90\",\"deviceStatus\":{\"loseTrack\":\"0\",\"valueLack\":\"0\",\"leakAlarm\":\"0\",\"remoteCloseValve\":\"1\",\"vibrationStop\":\"0\",\"buttonMode\":\"0\",\"deviceLock\":\"0\",\"isAccount\":\"1\",\"breakLine\":\"0\",\"singleCount\":\"0\",\"magneticInterference\":\"0\",\"superFlow\":\"0\",\"factoryMode\":\"1\",\"pressureLack\":\"0\",\"valveState\":\"1\"},\"deviceTime\":\"20190701T234910Z\",\"voltage\":\"4.91\",\"identityCode\":\"89860317492039663768\",\"moduleIMEI\":\"863703038784190\",\"signalIntensity\":\"2\",\"signalStrength\":-1194,\"signalPower\":-1088,\"signalCellID\":163869138,\"signalECL\":1,\"signalSNR\":7,\"signalPCI\":295,\"linkQuality\":-136,\"softWareVer\":\"9\",\"firmwareVer\":\"R2027\"}},{\"serviceId\":\"FreezeDataReportInfo\",\"serviceData\":{\"dfCount\":\"0\",\"dfId\":\"0\",\"connType\":\"0\",\"deviceType\":\"2\",\"subDeviceType\":\"12\",\"companyNo\":\"999999\",\"freezeCount\":\"0\",\"freezeDatas\":null}}]}",
            "msgContent": "BB01025602080C9999999000008888000000006000A8B670678C9E3DC24A5CF51A67E0003E8C6F3CF513378103CF2B221B965DCA91F5DD1A7834337C1FA61DE71B04CC54F916701A5A77CF0544A2FEACA2DD6942BBB9718B7CDF5EAF5B2E63A5FE28E3794644F3EEA39D6CAD30A08199991C43DC25626C",
            "hasTestHang": 0,
            "callbackResult": 1,
            "msgDeviceType": 0,
            "linkType": 0
        },{
            "id": "e33b54d057c34f10bfecfe55d2e9684d",
            "registTime": "2019-07-01 15:49:11",
            "updateTime": "2019-07-01 15:49:12",
            "gmId": "9999999000008888",
            "concentratorNum": "",
            "deviceType": "",
            "subdeviceType": "",
            "anysType": 0,
            "port": 0,
            "ip": "",
            "msgJsoncontent": "{\"identifier\":\"9000008888\",\"hasMore\":0,\"mid\":586,\"msgType\":\"deviceReq\",\"data\":[{\"serviceId\":\"GeneralReportInfo\",\"serviceData\":{\"dfCount\":\"0\",\"dfId\":\"0\",\"connType\":\"0\",\"deviceType\":\"2\",\"subDeviceType\":\"12\",\"companyNo\":\"999999\",\"meterType\":\"0000\",\"dataType\":\"00\",\"totalUseValue\":\"7.90\",\"recentFreezeValue\":\"7.90\",\"deviceStatus\":{\"loseTrack\":\"0\",\"valueLack\":\"0\",\"leakAlarm\":\"0\",\"remoteCloseValve\":\"1\",\"vibrationStop\":\"0\",\"buttonMode\":\"0\",\"deviceLock\":\"0\",\"isAccount\":\"1\",\"breakLine\":\"0\",\"singleCount\":\"0\",\"magneticInterference\":\"0\",\"superFlow\":\"0\",\"factoryMode\":\"1\",\"pressureLack\":\"0\",\"valveState\":\"1\"},\"deviceTime\":\"20190701T154905Z\",\"voltage\":\"5.39\",\"identityCode\":\"89860317492039663768\",\"moduleIMEI\":\"863703038784190\",\"signalIntensity\":\"3\",\"signalStrength\":-1139,\"signalPower\":-1069,\"signalCellID\":80010836,\"signalECL\":1,\"signalSNR\":93,\"signalPCI\":183,\"linkQuality\":-111,\"softWareVer\":\"9\",\"firmwareVer\":\"R2027\"}},{\"serviceId\":\"FreezeDataReportInfo\",\"serviceData\":{\"dfCount\":\"0\",\"dfId\":\"0\",\"connType\":\"0\",\"deviceType\":\"2\",\"subDeviceType\":\"12\",\"companyNo\":\"999999\",\"freezeCount\":\"1\",\"freezeDatas\":[{\"freezeDate\":\"20190701T150000Z\",\"freezeValue\":\"7.90\"}]}}]}",
            "msgContent": "BB01024A02080C9999999000008888000000006000544E03707B118B43F50857CFED37915A97599E43DD2E90FDD58B0D41820A81DD7390E567D81CD14E5ACF7330A1238A89141DB5F37AD1C70876BE7DA16F50BB85FA930EA0E8D1DDABFB8F91528D762A55B706CFC565D19B8C75B333D6FFE81F7FAB4E",
            "hasTestHang": 0,
            "callbackResult": 1,
            "msgDeviceType": 0,
            "linkType": 0
        }],
        "firstPage": 1,
        "prePage": 0,
        "nextPage": 2,
        "lastPage": 3,
        "isFirstPage": true,
        "isLastPage": false,
        "hasPreviousPage": false,
        "hasNextPage": true,
        "navigatePages": 8,
        "navigatepageNums": [1, 2, 3]
    },
    "args": ""
}

第一步:

responsecontent为上文的文件

将JSON字符串JObject格式化:JObject job = JObject.Parse(responsecontent);

 

第二步:将list里面的数据Jarray化: JArray array2 = JArray.Parse(job["result"]["list"].ToString());

 

循环array2得到我们想要的数据,命名比较随意请见谅,以下是具体的解析代码:

for (int j = 0; j < array2.Count; j++)
                        {
                            dr = dt.NewRow();
                            JObject jObject = JObject.Parse(array2[j].ToString());
                            
                            string ss = jObject["msgJsoncontent"].ToString();
                            JObject js = JObject.Parse(ss);
                            
                            string sss = js["data"].ToString();
                            JArray array = JArray.Parse(sss);
                            //通过lamda表达式选择data里面serviceId=GeneralReportInfo再获取下面的totalUseValue值
                            foreach (var item in array.Where(a => a["serviceId"].ToString() == "GeneralReportInfo"))
                            {
                                JObject a = JObject.Parse(item["serviceData"].ToString());
                                string totalUseValue  = a["totalUseValue"].ToString();//此处我们就得到了我们想要的数据 
                                
                            } 
                         }
View Code

 

adnanh webhook 框架 hook rule

adnanh webhook 框架 hook rule

adnanh webhook 支持一系列的逻辑操作

AND

所有的条件都必须匹配

{
"and":
  [
    {
      "match":
      {
        "type": "value",
        "value": "refs/heads/master",
        "parameter":
        {
          "source": "payload",
          "name": "ref"
        }
      }
    },
    {
      "match":
      {
        "type": "regex",
        "regex": ".*",
        "parameter":
        {
          "source": "payload",
          "name": "repository.owner.name"
        }
      }
    }
  ]
}

OR

匹配条件中有一个为 true 即可

{
"or":
  [
    {
      "match":
      {
        "type": "value",
        "value": "refs/heads/master",
        "parameter":
        {
          "source": "payload",
          "name": "ref"
        }
      }
    },
    {
      "match":
      {
        "type": "value",
        "value": "refs/heads/development",
        "parameter":
        {
          "source": "payload",
          "name": "ref"
        }
      }
    }
  ]
}

NOT

为 false 是执行

{
"not":
  {
    "match":
    {
      "type": "value",
      "value": "refs/heads/development",
      "parameter":
      {
        "source": "payload",
        "name": "ref"
      }
    }
  }
}

混合

{
    "and": [
    {
        "match": {
            "parameter": {
                "source": "header",
                "name": "X-Hub-Signature"
            },
            "type": "payload-hash-sha1",
            "secret": "mysecret"
        }
    },
    {
        "or": [
        {
            "match":
            {
                "parameter":
                {
                    "source": "payload",
                    "name": "ref"
                },
                "type": "value",
                "value": "refs/heads/master"
            }
        },
        {
            "match":
            {
                "parameter":
                {
                    "source": "header",
                    "name": "X-GitHub-Event"
                },
                "type": "value",
                "value": "ping"
            }
        }
        ]
    }
    ]
}

match 原则

  • 值匹配
{
  "match":
  {
    "type": "value",
    "value": "refs/heads/development",
    "parameter":
    {
      "source": "payload",
      "name": "ref"
    }
  }
}
  • 正则匹配
{
  "match":
  {
    "type": "regex",
    "regex": ".*",
    "parameter":
    {
      "source": "payload",
      "name": "ref"
    }
  }
}
  • hash sha1 算法匹配
{
  "match":
  {
    "type": "payload-hash-sha1",
    "secret": "yoursecret",
    "parameter":
    {
      "source": "header",
      "name": "X-Hub-Signature"
    }
  }
}
  • ip 白名单匹配
{
  "match":
  {
    "type": "ip-whitelist",
    "ip-range": "192.168.0.1/24"
  }
}

参考资料

https://github.com/adnanh/webhook/blob/master/docs/Hook-Rules.md

 
 
 
 

asp.net-mvc-4 – Web API 2返回OK响应,但在后台继续处理

asp.net-mvc-4 – Web API 2返回OK响应,但在后台继续处理

我已经为shopify创建了一个mvc web api 2 webhook:

public class ShopifyController : ApiController
{
    // PUT: api/Afilliate/SaveOrder
    [ResponseType(typeof(string))]
    public IHttpActionResult WebHook(ShopifyOrder order)
    {
        // need to return 202 response otherwise webhook is deleted
        return Ok(ProcessOrder(order));
    }
}

ProcessOrder遍历订单并将详细信息保存到内部数据库.

但是,如果进程花费的时间太长,那么webhook会再次调用api,因为它认为它已经失败了.有没有办法先退回ok响应,然后再进行处理?

有点像在mvc控制器中返回重定向并且可以选择在重定向后继续处理其余操作.

请注意,我总是需要以Shopify的形式返回ok响应,如果它失败了19次,那么智慧决定删除webhook(并且处理时间过长会被视为失败)

解决方法

我设法通过使用Task异步运行处理来解决我的问题:

// PUT: api/Afilliate/SaveOrder
    public IHttpActionResult WebHook(ShopifyOrder order)
    {
        // this should process the order asynchronously
        var tasks = new[]
        {
            Task.Run(() => ProcessOrder(order))
        };

        // without the await here,this should be hit before the order processing is complete
        return Ok("ok");
    }

c# – ASP.NET WebAPI 2嵌套JSON

c# – ASP.NET WebAPI 2嵌套JSON

我已经坚持了一段时间,我似乎无法弄明白.感谢任何帮助!

这是我的模特:http://www.jsoneditoronline.org/?id=9ee3466c40627f33c284e63544c8b8a7

我有适当的C#对象设置如下:

public class Media
{
    public string name { get; set; }
    public string title { get; set; }
    public string album { get; set; }
    public string artist { get; set; }
    public string length { get; set; }
    public int bitrate { get; set; }
    public double size { get; set; }
    public string start_time { get; set; }
    public string mimetype { get; set; }
    public string hash { get; set; }
}

public class Playlist
{
    public string name { get; set; }
    public List<Media> media { get; set; }
    public List<Graphics> graphics { get; set; }
    public bool shuffle { get; set; }
    public int volume { get; set; }
    public string start_time { get; set; }
    public string end_time { get; set; }
}

public class Day
{
    public string name { get; set; }
    public List<Playlist> playlists { get; set; }
}


public class Schedule
{
    public List<Day> days { get; set; }
    public string hash { get; set; }
}

我需要直接从MVC控制器POST整个JSON对象.在其他情况下,我想把时间表.我该如何妥善处理?实例可能真的有帮助.

谢谢!

我已经在POST下面做了以下事情:

var schedule = JsonConvert.DeserializeObject<Schedule>(model.ToString());

这是按预期工作的,但是,有时相关的Media对象已经存在于数据库中,并且在尝试INSERT同一个Media对象(已经存在)时导致内部服务器错误 – Media的[Key]是hash属性.

解决方法

您需要序列化Day类.

使用Newtonsoft.json nuget包你需要将它序列化为对象.它会自动将复杂对象序列化为json

List<Day> days = // list of days result
var jsonData= JsonConvert.SerializeObject(days);
return json(jsonData);

更新

根据您的更新序列化和反序列化功能正常工作.在Media中插入记录时遇到问题.
哈希不是唯一的.和哈希碰撞是可能的.您需要改进哈希生成代码以使用相同的哈希.
有用的链接来理解哈希

> what is hash ? is it unique?
> Can 2 different string have the same hash code in C#
> Socks,birthdays and hash collisions
> Preventing Duplicates: Hash Table vs. Dictionary vs. Binary Search Tree

关于从get webhook响应嵌套json创建数组jsonobject 获取嵌套key的介绍已经告一段落,感谢您的耐心阅读,如果想了解更多关于.net 解析嵌套JSON、adnanh webhook 框架 hook rule、asp.net-mvc-4 – Web API 2返回OK响应,但在后台继续处理、c# – ASP.NET WebAPI 2嵌套JSON的相关信息,请在本站寻找。

本文标签: