簡體   English   中英

如何在 C# 中為 Infopath 提取 JSON 數組條目

[英]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. 將 Success 和 Fail 合並為一個 Json 對象(見我下面的示例)
  2. 將您的 Json 粘貼到諸如http://json2csharp.com/ 之類的網站中。 這將為您提供建模 Json 對象的類(如下面我的第二個示例)
  3. 使用 NewtonSoft 的方法 JsonConvert.DeserializeObject(json) 將您的 json 字符串轉換為 RootObject 類的實例(如果您願意,可以重命名該類)
  4. 像使用任何其他類一樣使用新創建的類,不再需要知道它來自 Web 服務。

示例 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM