如何从 JObject 获取值
How to get values from JObject
我想将 Pipedrive 与 Dynamics CRM 集成。每当交易在 Pipedrive 中更新时,我都会调用 webhook。我正在获取 JObject 形式的数据。我想从中提取两个字段。一个是状态,另一个是 title.How 我可以这样做吗?
调用 Webhook 的代码:
[RoutePrefix("api/webhook")]
public class WebhookController : ApiController
{
[HttpPost]
[Route("")]
public void Post(JObject message)
{
Console.WriteLine($"Received webhook: {message}");
}
}
Json 我得到的是:
{
"v":1,
"matches_filters":{
"current":[
]
},
"meta":{
"v":1,
"action":"updated",
"object":"deal",
"id":1,
"company_id":2278508,
"user_id":3371496,
"host":"agniket.pipedrive.com",
"timestamp":1512620040,
"timestamp_micro":1512620040475200,
"permitted_user_ids":[
3371496
],
"trans_pending":false,
"is_bulk_update":false,
"pipedrive_service_name":false,
"matches_filters":{
"current":[
]
},
"webhook_id":"31814"
},
"current":{
"id":1,
"public_id":null,
"creator_user_id":3371496,
"user_id":3371496,
"person_id":1,
"org_id":null,
"stage_id":1,
"title":"vaishali deal",
"value":0,
"currency":"INR",
"add_time":"2017-12-04 04:44:15",
"update_time":"2017-12-07 04:14:00",
"stage_change_time":null,
"active":false,
"deleted":false,
"status":"won",
"probability":null,
"next_activity_date":null,
"next_activity_time":null,
"next_activity_id":null,
"last_activity_id":null,
"last_activity_date":null,
"lost_reason":null,
"visible_to":"3",
"close_time":"2017-12-07 04:14:00",
"pipeline_id":1,
"won_time":"2017-12-07 04:14:00",
"first_won_time":"2017-12-07 04:14:00",
"lost_time":null,
"products_count":0,
"files_count":0,
"notes_count":0,
"followers_count":1,
"email_messages_count":0,
"activities_count":0,
"done_activities_count":0,
"undone_activities_count":0,
"reference_activities_count":0,
"participants_count":1,
"expected_close_date":null,
"last_incoming_mail_time":null,
"last_outgoing_mail_time":null,
"stage_order_nr":1,
"person_name":"vaishali",
"org_name":null,
"next_activity_subject":null,
"next_activity_type":null,
"next_activity_duration":null,
"next_activity_note":null,
"formatted_value":"₹0",
"rotten_time":null,
"weighted_value":0,
"formatted_weighted_value":"₹0",
"owner_name":"riya dalvi",
"cc_email":"agniket+deal1@pipedrivemail.com",
"org_hidden":false,
"person_hidden":false
},
"previous":{
"id":1,
"public_id":null,
"creator_user_id":3371496,
"user_id":3371496,
"person_id":1,
"org_id":null,
"stage_id":1,
"title":"vaishali deal",
"value":0,
"currency":"INR",
"add_time":"2017-12-04 04:44:15",
"update_time":"2017-12-04 06:33:56",
"stage_change_time":null,
"active":true,
"deleted":false,
"status":"open",
"probability":null,
"next_activity_date":null,
"next_activity_time":null,
"next_activity_id":null,
"last_activity_id":null,
"last_activity_date":null,
"lost_reason":null,
"visible_to":"3",
"close_time":null,
"pipeline_id":1,
"won_time":null,
"first_won_time":null,
"lost_time":null,
"products_count":0,
"files_count":0,
"notes_count":0,
"followers_count":1,
"email_messages_count":0,
"activities_count":0,
"done_activities_count":0,
"undone_activities_count":0,
"reference_activities_count":0,
"participants_count":1,
"expected_close_date":null,
"last_incoming_mail_time":null,
"last_outgoing_mail_time":null,
"stage_order_nr":1,
"person_name":"vaishali",
"org_name":null,
"next_activity_subject":null,
"next_activity_type":null,
"next_activity_duration":null,
"next_activity_note":null,
"formatted_value":"₹0",
"rotten_time":null,
"weighted_value":0,
"formatted_weighted_value":"₹0",
"owner_name":"riya dalvi",
"cc_email":"agniket+deal1@pipedrivemail.com",
"org_hidden":false,
"person_hidden":false
},
"event":"updated.deal",
"retry":0
}
你可以这样试试;
[HttpPost]
[Route("")]
public void Post(JObject message)
{
var dynamicMessage = (dynamic)message;
var status = dynamicMessage.status;
var title = dynamicMessage.title;
}
如果是常规 HTTP 调用,您可以使用内置的 JSON 模型绑定器。
尝试将您的 JObject
更改为代表您的消息的 class,例如:
(更新结构以提供 JSON 表示)
public class Message
{
public Current Current { get; set; }
}
public class Current
{
public string Status { get; set; }
public string Title { get; set; }
}
并在您的 WebHook
:
中使用它
[RoutePrefix("api/webhook")]
public class WebhookController : ApiController
{
[HttpPost]
[Route("")]
public void Post(Message message)
{
Console.WriteLine($"Received webhook: {message.Current.Title} {message.Current.Status}");
}
}
我会用SelectToken
. You can specify a JSONPath来达到目标值。假设您想要 current 状态和头衔,您会这样做:
string status = (string)message.SelectToken("current.status");
string title = (string)message.SelectToken("current.title");
如果您想要之前的状态和头衔,请改用previous.status
和previous.title
。
我想将 Pipedrive 与 Dynamics CRM 集成。每当交易在 Pipedrive 中更新时,我都会调用 webhook。我正在获取 JObject 形式的数据。我想从中提取两个字段。一个是状态,另一个是 title.How 我可以这样做吗?
调用 Webhook 的代码:
[RoutePrefix("api/webhook")]
public class WebhookController : ApiController
{
[HttpPost]
[Route("")]
public void Post(JObject message)
{
Console.WriteLine($"Received webhook: {message}");
}
}
Json 我得到的是:
{
"v":1,
"matches_filters":{
"current":[
]
},
"meta":{
"v":1,
"action":"updated",
"object":"deal",
"id":1,
"company_id":2278508,
"user_id":3371496,
"host":"agniket.pipedrive.com",
"timestamp":1512620040,
"timestamp_micro":1512620040475200,
"permitted_user_ids":[
3371496
],
"trans_pending":false,
"is_bulk_update":false,
"pipedrive_service_name":false,
"matches_filters":{
"current":[
]
},
"webhook_id":"31814"
},
"current":{
"id":1,
"public_id":null,
"creator_user_id":3371496,
"user_id":3371496,
"person_id":1,
"org_id":null,
"stage_id":1,
"title":"vaishali deal",
"value":0,
"currency":"INR",
"add_time":"2017-12-04 04:44:15",
"update_time":"2017-12-07 04:14:00",
"stage_change_time":null,
"active":false,
"deleted":false,
"status":"won",
"probability":null,
"next_activity_date":null,
"next_activity_time":null,
"next_activity_id":null,
"last_activity_id":null,
"last_activity_date":null,
"lost_reason":null,
"visible_to":"3",
"close_time":"2017-12-07 04:14:00",
"pipeline_id":1,
"won_time":"2017-12-07 04:14:00",
"first_won_time":"2017-12-07 04:14:00",
"lost_time":null,
"products_count":0,
"files_count":0,
"notes_count":0,
"followers_count":1,
"email_messages_count":0,
"activities_count":0,
"done_activities_count":0,
"undone_activities_count":0,
"reference_activities_count":0,
"participants_count":1,
"expected_close_date":null,
"last_incoming_mail_time":null,
"last_outgoing_mail_time":null,
"stage_order_nr":1,
"person_name":"vaishali",
"org_name":null,
"next_activity_subject":null,
"next_activity_type":null,
"next_activity_duration":null,
"next_activity_note":null,
"formatted_value":"₹0",
"rotten_time":null,
"weighted_value":0,
"formatted_weighted_value":"₹0",
"owner_name":"riya dalvi",
"cc_email":"agniket+deal1@pipedrivemail.com",
"org_hidden":false,
"person_hidden":false
},
"previous":{
"id":1,
"public_id":null,
"creator_user_id":3371496,
"user_id":3371496,
"person_id":1,
"org_id":null,
"stage_id":1,
"title":"vaishali deal",
"value":0,
"currency":"INR",
"add_time":"2017-12-04 04:44:15",
"update_time":"2017-12-04 06:33:56",
"stage_change_time":null,
"active":true,
"deleted":false,
"status":"open",
"probability":null,
"next_activity_date":null,
"next_activity_time":null,
"next_activity_id":null,
"last_activity_id":null,
"last_activity_date":null,
"lost_reason":null,
"visible_to":"3",
"close_time":null,
"pipeline_id":1,
"won_time":null,
"first_won_time":null,
"lost_time":null,
"products_count":0,
"files_count":0,
"notes_count":0,
"followers_count":1,
"email_messages_count":0,
"activities_count":0,
"done_activities_count":0,
"undone_activities_count":0,
"reference_activities_count":0,
"participants_count":1,
"expected_close_date":null,
"last_incoming_mail_time":null,
"last_outgoing_mail_time":null,
"stage_order_nr":1,
"person_name":"vaishali",
"org_name":null,
"next_activity_subject":null,
"next_activity_type":null,
"next_activity_duration":null,
"next_activity_note":null,
"formatted_value":"₹0",
"rotten_time":null,
"weighted_value":0,
"formatted_weighted_value":"₹0",
"owner_name":"riya dalvi",
"cc_email":"agniket+deal1@pipedrivemail.com",
"org_hidden":false,
"person_hidden":false
},
"event":"updated.deal",
"retry":0
}
你可以这样试试;
[HttpPost]
[Route("")]
public void Post(JObject message)
{
var dynamicMessage = (dynamic)message;
var status = dynamicMessage.status;
var title = dynamicMessage.title;
}
如果是常规 HTTP 调用,您可以使用内置的 JSON 模型绑定器。
尝试将您的 JObject
更改为代表您的消息的 class,例如:
(更新结构以提供 JSON 表示)
public class Message
{
public Current Current { get; set; }
}
public class Current
{
public string Status { get; set; }
public string Title { get; set; }
}
并在您的 WebHook
:
[RoutePrefix("api/webhook")]
public class WebhookController : ApiController
{
[HttpPost]
[Route("")]
public void Post(Message message)
{
Console.WriteLine($"Received webhook: {message.Current.Title} {message.Current.Status}");
}
}
我会用SelectToken
. You can specify a JSONPath来达到目标值。假设您想要 current 状态和头衔,您会这样做:
string status = (string)message.SelectToken("current.status");
string title = (string)message.SelectToken("current.title");
如果您想要之前的状态和头衔,请改用previous.status
和previous.title
。