[英]How to extract a JSON Array entry in C# for Infopath
我是編程新手。 想要創建一個 C# Infopath 按鈕,單擊時將發送 SMS。 除了來自服務器的響應外,一切都很順利。 我能夠顯示此響應,但我想顯示 WEB 響應的某些部分。 這是我的代碼:
using Microsoft.Office.InfoPath;
using System;
using System.Xml;
using System.Xml.XPath;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
using System.Net;
using System.Web;
using System.Web.Script.Serialization;
//using System.Json;
using Newtonsoft.Json;
namespace SMS_Form_Fields
{
public partial class FormCode
{
// Member variables are not supported in browser-enabled forms.
// Instead, write and read these values from the FormState
// dictionary using code such as the following:
//
// private object _memberVariable
// {
// get
// {
// return FormState["_memberVariable"];
// }
// set
// {
// FormState["_memberVariable"] = value;
// }
// }
// NOTE: The following procedure is required by Microsoft InfoPath.
// It can be modified using Microsoft InfoPath.
public void InternalStartup()
{
EventManager.FormEvents.Submit += new SubmitEventHandler(FormEvents_Submit);
}
public void FormEvents_Submit(object sender, SubmitEventArgs e)
{
var UriBuilder = new UriBuilder("http://smsgateway.me/api/v3/messages/send/");
var parameters = HttpUtility.ParseQueryString(string.Empty);
parameters["email"] = MainDataSource.CreateNavigator().SelectSingleNode("/my:myFields/my:email", NamespaceManager).Value;
parameters["password"] = MainDataSource.CreateNavigator().SelectSingleNode("/my:myFields/my:password", NamespaceManager).Value;
parameters["device"] = MainDataSource.CreateNavigator().SelectSingleNode("/my:myFields/my:device", NamespaceManager).Value; ;
parameters["number"] = MainDataSource.CreateNavigator().SelectSingleNode("/my:myFields/my:MobileNumber", NamespaceManager).Value;
parameters["message"] = MainDataSource.CreateNavigator().SelectSingleNode("/my:myFields/my:SMS_TO_BE_SENT", NamespaceManager).Value; ;
UriBuilder.Query = parameters.ToString();
//UriBuilder.Fragment = "some_fragment";
Uri finalUrl = UriBuilder.Uri;
var request = WebRequest.Create(finalUrl);
// Get the response.
WebResponse result = request.GetResponse();
// Get the stream containing content returned by the server.
Stream dataStream = result.GetResponseStream();
// Open the stream using a StreamReader for easy access.
StreamReader reader = new StreamReader(dataStream);
// Read the content.
string responseFromServer = reader.ReadToEnd();
dynamic stuff = JsonConvert.DeserializeObject(responseFromServer);
var result1 = stuff.result;
var success1 = result1.success;
string value = Convert.ToString(success1);
// Display the content.
System.Windows.Forms.MessageBox.Show(value);
}
// Clean up the streams.
reader.Close();
dataStream.Close();
result.Close();
}
}
這是成功的 JSON 示例
{
"success": true,
"result": {
"success": [
{
"id": "308",
"device_id": "4",
"message": "hello world!",
"status": "pending",
"send_at": "1414624856",
"queued_at": "0",
"sent_at": "0",
"delivered_at": "0",
"expires_at": "1414634856",
"canceled_at": "0",
"failed_at": "0",
"received_at": "0",
"error": "None",
"created_at": "1414624856",
"contact": {
"id": "14",
"name": "Phyllis Turner",
"number": "+447791064713"
}
}
],
"fails": [
]
}
}
這是失敗的 JSON 示例
{
"success": true,
"result": {
"success": [
],
"fails": [
"number": "+44771232343"
"message": "hello world!",
"device": 1
"errors": {
"device": ["The selected device is invalid"],
}
]
}
}
我想要做的就是如果它成功我應該能夠顯示 JSON 的任何部分,例如 ID、設備 ID 或消息,如果它失敗那么我也應該能夠顯示 JSON 的任何部分,例如設備、數量或錯誤。
在 SteveJ 指出后更新失敗響應:
{
"success": true,
"result": {
"success": [],
"fails": [
{
"email": "abc@xyz.com",
"password": "anypassword",
"device": 1,
"number": "+44771232343",
"message": "hello world!",
"errors": {
"device": [
"The selected device is invalid"
]
}
}
]
}
}
第一:您提供的失敗響應未驗證。 將其粘貼到JSONLint 中,您將看到它驗證失敗。 也許這是一個復制/粘貼錯誤 - 但你需要理順它。 除此之外,這里是步驟。
示例 1:修改后的 Json
{
"success": true,
"result":
{
"success":
[
{
"id": "308",
"device_id": "4",
"message": "hello world!",
"status": "pending",
"send_at": "1414624856",
"queued_at": "0",
"sent_at": "0",
"delivered_at": "0",
"expires_at": "1414634856",
"canceled_at": "0",
"failed_at": "0",
"received_at": "0",
"error": "None",
"created_at": "1414624856",
"contact":
{
"id": "14",
"name": "Phyllis Turner",
"number": "+447791064713"
}
}
],
"fails":
[
{
"number": "+44771232343",
"message": "hello world!",
"device": 1,
"errors":
{
"device": ["The selected device is invalid"]
}
}
]
}
}
示例 2:所需的類列表
public class Contact
{
public string id { get; set; }
public string name { get; set; }
public string number { get; set; }
}
public class Success
{
public string id { get; set; }
public string device_id { get; set; }
public string message { get; set; }
public string status { get; set; }
public string send_at { get; set; }
public string queued_at { get; set; }
public string sent_at { get; set; }
public string delivered_at { get; set; }
public string expires_at { get; set; }
public string canceled_at { get; set; }
public string failed_at { get; set; }
public string received_at { get; set; }
public string error { get; set; }
public string created_at { get; set; }
public Contact contact { get; set; }
}
public class Errors
{
public List<string> device { get; set; }
}
public class Fail
{
public string number { get; set; }
public string message { get; set; }
public int device { get; set; }
public Errors errors { get; set; }
}
public class Result
{
public List<Success> success { get; set; }
public List<Fail> fails { get; set; }
}
public class RootObject
{
public bool success { get; set; }
public Result result { get; set; }
}
用法
static void Main(string[] args)
{
var successJson = "{\"success\": true,\"result\": {\"success\": [{\"id\": \"308\",\"device_id\": \"4\"," +
"\"message\": \"hello world!\",\"status\": \"pending\",\"send_at\": \"1414624856\", \"queued_at\": \"0\", " +
"\"sent_at\": \"0\", \"delivered_at\": \"0\", \"expires_at\": \"1414634856\", \"canceled_at\": \"0\"," +
"\"failed_at\": \"0\", \"received_at\": \"0\", \"error\": \"None\", \"created_at\": \"1414624856\"," +
"\"contact\": {\"id\": \"14\", \"name\": \"Phyllis Turner\", \"number\": \"+447791064713\"} " +
"}],\"fails\": []}}";
var successRoot = JsonConvert.DeserializeObject<RootObject>(successJson);
var isSuccess = successRoot.result.success != null && successRoot.result.success.Count > 0;
var isFail = successRoot.result.fails != null && successRoot.result.fails.Count > 0;
var message = successRoot.result.success.First().message;
}
這是解決我的問題的代碼。 歸功於 SteveJ。
using Microsoft.Office.InfoPath;
using System.Windows.Forms;
using mshtml;
using System;
using System.Xml;
using System.Xml.XPath;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
using System.Net;
using System.Web;
using System.Web.Script.Serialization;
using System.ServiceModel.Web;
using Newtonsoft.Json;
namespace sms_form1
{
public class Contact
{
public string id { get; set; }
public string name { get; set; }
public string number { get; set; }
}
public class Success
{
public string id { get; set; }
public string device_id { get; set; }
public string message { get; set; }
public string status { get; set; }
public string send_at { get; set; }
public string queued_at { get; set; }
public string sent_at { get; set; }
public string delivered_at { get; set; }
public string expires_at { get; set; }
public string canceled_at { get; set; }
public string failed_at { get; set; }
public string received_at { get; set; }
public string error { get; set; }
public string created_at { get; set; }
public Contact contact { get; set; }
}
public class Errors
{
public List<String> device { get; set; }
}
public class Fail
{
public string email { get; set; }
public string password { get; set; }
public string device { get; set; }
public string number { get; set; }
public string message { get; set; }
public Errors errors { get; set; }
}
public class Result
{
public List<Success> success { get; set; }
public List<Fail> fails { get; set; }
}
public class RootObject
{
public bool success { get; set; }
public Result result { get; set; }
}
public partial class FormCode
{
public void InternalStartup()
{
EventManager.FormEvents.Submit += new SubmitEventHandler(FormEvents_Submit);
}
public void FormEvents_Submit(object sender, SubmitEventArgs e)
{
var UriBuilder = new UriBuilder("http://smsgateway.me/api/v3/messages/send/");
var parameters = HttpUtility.ParseQueryString(string.Empty);
parameters["email"] = MainDataSource.CreateNavigator().SelectSingleNode("/my:myFields/my:email", NamespaceManager).Value;
parameters["password"] = MainDataSource.CreateNavigator().SelectSingleNode("/my:myFields/my:password", NamespaceManager).Value;
parameters["device"] = MainDataSource.CreateNavigator().SelectSingleNode("/my:myFields/my:device", NamespaceManager).Value; ;
parameters["number"] = MainDataSource.CreateNavigator().SelectSingleNode("/my:myFields/my:MobileNumber", NamespaceManager).Value;
parameters["message"] = MainDataSource.CreateNavigator().SelectSingleNode("/my:myFields/my:SMS_TO_BE_SENT", NamespaceManager).Value; ;
UriBuilder.Query = parameters.ToString();
//UriBuilder.Fragment = "some_fragment";
Uri finalUrl = UriBuilder.Uri;
var request = WebRequest.Create(finalUrl);
// Get the response.
WebResponse result = request.GetResponse();
// Get the stream containing content returned by the server.
Stream dataStream = result.GetResponseStream();
// Open the stream using a StreamReader for easy access.
StreamReader reader = new StreamReader(dataStream);
// Read the content.
string responseFromServer = reader.ReadToEnd();
var successRoot = JsonConvert.DeserializeObject<RootObject>(responseFromServer);
var isSuccess = successRoot.result.success != null && successRoot.result.success.Count > 0;
var isFail = successRoot.result.fails != null && successRoot.result.fails.Count > 0;
if (isSuccess)
{
var id = successRoot.result.success.First().id;
var message = successRoot.result.success.First().message;
// Display the content.
string value = Convert.ToString(id);
string value1 = Convert.ToString(message);
System.Windows.Forms.MessageBox.Show("SMS "+value+" "+value1+" Sent SuccessFully" );
}
else
{
//var messagefail = successRoot.result.fails.First().device;
//string value = Convert.ToString(messagefail);
System.Windows.Forms.MessageBox.Show("SMS Could Not Be Sent. Check Device");
}
// Clean up the streams.
reader.Close();
dataStream.Close();
result.Close();
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.