본문 바로가기

언어/C#

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

출처: http://son10001.blogspot.kr/2015/05/c-winform-json.html


.Net 의 웹서비스를 이용해서 JSON 데이터를 보내는 것을 만들어 보았다.

[JSON 웹서비스 만들기 링크: http://son10001.blogspot.kr/2015/05/c-json.html]


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

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


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


Json.NET 을 설치하면...


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

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

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

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

01using System;
02using System.Collections.Generic;
03using System.ComponentModel;
04using System.Data;
05using System.Drawing;
06using System.Linq;
07using System.Text;
08using System.Threading.Tasks;
09using System.Windows.Forms;
10using Newtonsoft.Json.Linq;
11using System.Net;
12using System.IO;
13 
14namespace IPlugWorks
15{
16    public partial class frmWebService : Form
17    {
18        public frmWebService()
19        {
20            InitializeComponent();
21        }
22 
23        private void button1_Click(object sender, EventArgs e)
24        {
25            Request_Json();
26        }
27 
28        private string Request_Json()
29        {
30            string result = null;
31            string url = "http://localhost:915/_Test/testService.asmx/getMemberInfoJson";
32 
33            try
34            {
35                HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
36                request.Method = "POST";
37                request.ContentType = "Application/json;charset=utf-8";
38 
39                //전달할 파라메타   
40                //string sendData = "param1=1&param2=2";
41                string sendData = "";
42 
43                byte[] buffer;
44                buffer = Encoding.Default.GetBytes(sendData);
45                request.ContentLength = buffer.Length;
46 
47                Stream sendStream = request.GetRequestStream();
48                sendStream.Write(buffer, 0, buffer.Length);
49                sendStream.Close();
50 
51                HttpWebResponse response = (HttpWebResponse)request.GetResponse();
52                Stream respPostStream = response.GetResponseStream();
53                StreamReader readerPost = new StreamReader(respPostStream, Encoding.UTF8);
54 
55                result = readerPost.ReadToEnd();
56                JsonParser(result);
57            }
58            catch (Exception e)
59            {
60                Console.WriteLine(e.Message);
61            }
62 
63            return result;
64        }
65 
66 
67        private void JsonParser(String json)
68        {
69            JObject obj = JObject.Parse(json);
70            JArray array = JArray.Parse(obj["d"].ToString());
71 
72            foreach (JObject itemObj in array)
73            {
74                textBox1.Text += " ID : " + itemObj["Id"].ToString();
75                textBox1.Text += " --- ";
76                textBox1.Text += " Name : " + itemObj["Name"].ToString();
77                textBox1.Text += "\r\n";
78            }
79        }
80    }
81}


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

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


결과값이...

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


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

이때... Newtonsoft.Json 로 Parse 시키면...

 이때 "d" 를 기준으로 파싱... 그러면...


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