2015년 5월 19일 화요일

C# WinForm : JSON 결과값을 반환하는 웹서비스 값 가져오기

.Net 의 웹서비스를 이용해서 JSON 데이터를 보내는 것을 만들어 보았다.
[JSON 웹서비스 만들기 링크: http://son10001.blogspot.kr/2015/05/c-json.html]

그럼 이걸 써먹어야지.
WinForm 에서 한번 불러와 보자.

일단 "Newtonsoft.Json" 를 참조에 넣자.

참조에 "NuGet 패키지 관리..." 에서...


Json.NET 을 설치하면...


이렇게 "Newtonsoft.Json" 이 설치된다.
물론 JSON 데이터를 직접 컨트롤할 자신이 있다면 안해도 되긴 한다.

일단 MIT License 라서 부담이 적으니 뭐... 그냥 쓰자...

그리고, 폼을 대충 하나 생성한다.

버튼을 클릭하면 아래 텍스트 박스에 데이터를 출력할 꺼임.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Newtonsoft.Json.Linq;
using System.Net;
using System.IO;

namespace IPlugWorks
{
    public partial class frmWebService : Form
    {
        public frmWebService()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Request_Json();
        }

        private string Request_Json()
        {
            string result = null;
            string url = "http://localhost:915/_Test/testService.asmx/getMemberInfoJson";

            try
            {
                HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
                request.Method = "POST";
                request.ContentType = "Application/json;charset=utf-8";

                //전달할 파라메타    
                //string sendData = "param1=1&param2=2";
                string sendData = "";

                byte[] buffer;
                buffer = Encoding.Default.GetBytes(sendData);
                request.ContentLength = buffer.Length;

                Stream sendStream = request.GetRequestStream();
                sendStream.Write(buffer, 0, buffer.Length);
                sendStream.Close();

                HttpWebResponse response = (HttpWebResponse)request.GetResponse();
                Stream respPostStream = response.GetResponseStream();
                StreamReader readerPost = new StreamReader(respPostStream, Encoding.UTF8);

                result = readerPost.ReadToEnd();
                JsonParser(result);
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
            }

            return result;
        }


        private void JsonParser(String json)
        {
            JObject obj = JObject.Parse(json);
            JArray array = JArray.Parse(obj["d"].ToString());

            foreach (JObject itemObj in array)
            {
                textBox1.Text += " ID : " + itemObj["Id"].ToString();
                textBox1.Text += " --- ";
                textBox1.Text += " Name : " + itemObj["Name"].ToString();
                textBox1.Text += "\r\n";
            }
        }
    }
}


이렇게 하면 되는데...
참고로, 웹서비스를 불러오는데, 웹서비스 참조를 등록하지 않고 바로 웹페이지를 로딩해서 쓰고 있다.

암튼. 이렇게하고 버튼을 눌러 조회 하면...


결과값이...

{\"d\":\"[{\\\"Id\\\":\\\"User01\\\",\\\"Name\\\":\\\"Guest\\\"},{\\\"Id\\\":\\\"Son10001\\\",\\\"Name\\\":\\\"Son\\\"}]\"}

이렇게 나온다.
왜그런지는 잘 모르겠지만, 전체 데이터가 "d" 로 Wrapping 되어서 나온다.
게다가 복잡하게 이스케이프 문자("\")가 썪여 있어서 쓰기 좀 번거롭다.

이때... Newtonsoft.Json 로 Parse 시키면...
 이때 "d" 를 기준으로 파싱... 그러면...


이렇게 정돈된 데이터를 얻을 수 있다.