레이블이 JSON인 게시물을 표시합니다. 모든 게시물 표시
레이블이 JSON인 게시물을 표시합니다. 모든 게시물 표시

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" 를 기준으로 파싱... 그러면...


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




C# 웹서비스로 JSON 결과값 생성하기

.Net 에는 웹서비스라는 좋은 기능이 있지만, 웹서비스란게 나올 당시에는 Xml 이 대세였던지라, 기본적인 결과값은 Xml 로 나오고, 웹에서 찾을수 있는 대부분의 예제들도 거의 대부분 Xml 을 가지고 설명한다.

하지만, 요즘은 JSON 이 대세인지라... .Net 웹서비스도 JSON 결과값을 출력할 필요가 있다.

일단 간단하게 웹서비스를 하나 생성하고...



서비스 이름은 아무거나 주면 되지만, 나의 경운 testService 라고 주었다.


"다른 파일에 코드 입력" 이 체크되어 있어서 "testService.asmx" 에는 별 내용이 없다.


이대로 냅두면 되고...


"testService.cs" 를 아래와 같이 편집한다.


[Source]

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Services;

using System.Web.Script.Services;
using System.Web.Script.Serialization;  

[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.Web.Script.Services.ScriptService]
public class testService : System.Web.Services.WebService 
{
    public testService () {
        //InitializeComponent(); 
    }

    [WebMethod]
    [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
    public string getMemberInfoJson()
    {
        Member[] info = new Member[] {  
            new Member()  
            {  
                Id  = "User01",  
                Name= "Guest"
            },  
            new Member()  
            {  
                Id  = "Son10001",  
                Name= "Son"
            }  
        };
        return new JavaScriptSerializer().Serialize(info);  
    }

    [WebMethod]
    public Member[] getMemberInfoXml()
    {
        Member[] info = new Member[] {  
            new Member()  
            {  
                Id  = "User01",  
                Name= "Guest"
            },  
            new Member()  
            {  
                Id  = "Son10001",  
                Name= "Son"
            }  
        };
        return info;
    }

    public class Member
    {
        public string Id { get; set; }
        public string Name { get; set; }
    }

}




다른건 별로 신경쓸것 없고, 아래에 표시한 상자의 내용만 주의 하면 된다.


이렇게 하고 웹에서 해당 웹서비스를 열어 보면...


이렇게 웹서비스가 2개 등록되어 있는게 보일것이다.
일단 JSON 이 목적이니 "getMemberInfoJson" 을 클릭해본다.


저기서 "호출" 이라는 버튼을 클릭해보면...


이렇게 JSON 형태로 결과값이 나온다.


마찬가지로 "getMemberInfoXml" 선택해 호출하면...

 이렇게 Xml 로 결과 값이 나온다.

이걸 웹에서 jQuery 로 호출해 보면...


<%@ Page Language="C#" %>

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>

    <title></title>
    <script src="js/jquery-1.4.4.min.js"></script>
    <script src="js/jquery-ui-1.8.8.custom.min.js"></script>
    <script>
        function HelloQuery() {
            $.ajax({
                type:"POST",
                url: "http://localhost:915/_Test/testService.asmx/getMemberInfoJson",
                processData:false,
                contentType:"Application/json;charset=utf-8",
                dataType:"json",
                success:function (data) {
                    alert(data.d);
                }
            });
        }
    </script>
</head>

<body>
    <form id="form1" runat="server">
    <div>
        <a href="#" onclick="HelloQuery()">Test</a>
    </div>
    </form>
</body>
</html>


이렇게 웹페이지를 만들고...


클릭해 호출... 하면...


이렇게 JSON 으로 결과값을 받을 수 있다.






2014년 4월 22일 화요일

ASP 에서 JSON 쓰는법

기본저으로 Asp 에서 Json 은 지원되지 않는다.
그러나 많은 사람들이 Json 을 사용할 수 있는 함수를 구현해 공개 해놓아서 그럭 저럭 쓸수 있다.
M$가 공식적으로 지원하는건 아니라서 약간 불안한 감은 없지 않아 있지만, 대략 100개 항목 정도를 보내고 받는데는 그다지 문제가 없었다.

첨부파일 : json.zip

이전에 프로젝트 할때 어디선가 받아서 쓴 파일인데... 도저히 원 배포처를 못찾겠다....

하여간...



<%
   Dim getJson
   Dim strData

   strData = REQUEST("u1")
   '//strData = "{""row"":[{""saveid"":""21655"",""get_import"":""KD200220"",""get_packer"":""KD420100""}]}"

   Set getJson = JSON.parse(strData)

   saveid = getJson.row.get(0).saveid
   get_import = getJson.row.get(0).get_import
   get_packer = getJson.row.get(0).get_packer
%>

 <%=get_import%>
 <%=get_packer%>
 <%=saveid%>


이런 식으로 쓰면 된다.