此处将为大家介绍关于从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)
- .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)
您可能要考虑编写自己的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
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();//此处我们就得到了我们想要的数据
}
}
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响应,但在后台继续处理
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(并且处理时间过长会被视为失败)
解决方法
// 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
这是我的模特: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属性.
解决方法
使用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的相关信息,请在本站寻找。
本文标签: