공학속으로/C#

C# json 파싱하기

더월드 2023. 9. 5.

C#  네이버 API를 이용한  뉴스 검색하기 코드

 

네이버 API를 이용하여 네이버 뉴스를 검색하는 코드를 작성해 볼께요. 

using System;
using System.IO;
using System.Net;
using System.Text;

namespace Naver_news
{
    internal class Program
    {
        static void Main(string[] args)
        {
            string _clientId = "네이버API ID";
            string _clientSecret = "네이버API 비밀번호";

            string query = "네이버 Open API"; // 검색할 문자열
            string url = "https://openapi.naver.com/v1/search/news?query=" + query; // JSON 결과
            // string url = "https://openapi.naver.com/v1/search/news.xml?query=" + query;  // XML 결과
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
            request.Headers.Add("X-Naver-Client-Id", _clientId); // 클라이언트 아이디
            request.Headers.Add("X-Naver-Client-Secret", _clientSecret);       // 클라이언트 시크릿
            HttpWebResponse response = (HttpWebResponse)request.GetResponse();
            string status = response.StatusCode.ToString();
            if (status == "OK")
            {
                Stream stream = response.GetResponseStream();
                StreamReader reader = new StreamReader(stream, Encoding.UTF8);
                string text = reader.ReadToEnd();
                Console.WriteLine(text);
            }
            else
            {
                Console.WriteLine("Error 발생=" + status);
            }
        }
    }
}

 

네이버 api 사용하여 뉴스 검색 결과 값은 받으면 아래와 같은 형태로 출력됩니다.

 

네이버 뉴스

{
        "lastBuildDate":"Fri, 15 Sep 2023 10:06:00 +0900",
        "total":9332971,
        "start":1,
        "display":10,
        "items":[
                {
                        "title":""이제 안참는다"…아이브 소속사 스타쉽, 가짜뉴스 '엄중처벌' 촉구",
                        "originallink":"https:\/\/www.viva100.com\/main\/view.php?key=20230915010004319",
                        "link":"https:\/\/www.viva100.com\/main\/view.php?key=20230915010004319",
                        "description":"교통<b>사고<\/b> 현장에 빠른 속도로 몰려드는 견인차를 부르는 ‘렉카’(wrecker)에 서 유래했다. 대중의 관심을 끌어 조회수를 올릴수록 더 큰 수익을 낼 수 있기 때문에 자극적인 이미지와 확인되지 않은 정보를 ‘아니면 말고’... ",
                        "pubDate":"Fri, 15 Sep 2023 10:04:00 +0900"
                },
                {
                        "title":"지역난방공사, 추석연휴 대비 난방시설 안전점검 실시",
                        "originallink":"https:\/\/www.ekn.kr\/web\/view.php?key=20230915010004203",
                        "link":"https:\/\/www.ekn.kr\/web\/view.php?key=20230915010004203",
                        "description":"한국지역난방공사(사장 정용기)는 추석연휴 기간 중 안정적인 지역난방 공급 및 재난·안전<b>사고<\/b> 예방을 위해... 지난 14일 경기 성남 분당지사 열수송관 공사현장을 방문해 안전<b>사고<\/b> 예방을 당부하고 있다. 한국지역난방공사",
                        "pubDate":"Fri, 15 Sep 2023 10:04:00 +0900"
                },

 

위 결과값에서 원하는 내용만 취하려면 json 파싱을 해야 합니다.

 

json 파싱 라이브러리를 사용하면 쉽게 원하는 값만 취할 수 있습니다.

 

json 파싱은 NuGet 패키지 Newtonsoft.json을 사용하면 편합니다.

 

json 파싱을 위해 NuGet 패키지 Newtonsoft.json을 설치

 

Newtonsoft.json 사용 방법

 

아래와 같은 형태의 json 이 있다면,

{
        "lastBuildDate":"Fri, 15 Sep 2023 10:06:00 +0900",
        "total":9332971,
        "start":1,
        "display":10,
        "items":[
                {
                        "title":"&quot;이제 안참는다&quot;…아이브 소속사 스타쉽, 가짜뉴스 '엄중처벌' 촉구",
                        "originallink":"https:\/\/www.viva100.com\/main\/view.php?key=20230915010004319",
                        "link":"https:\/\/www.viva100.com\/main\/view.php?key=20230915010004319",
                        "description":"교통<b>사고<\/b> 현장에 빠른 속도로 몰려드는 견인차를 부르는 ‘렉카’(wrecker)에 서 유래했다. 대중의 관심을 끌어 조회수를 올릴수록 더 큰 수익을 낼 수 있기 때문에 자극적인 이미지와 확인되지 않은 정보를 ‘아니면 말고’... ",
                        "pubDate":"Fri, 15 Sep 2023 10:04:00 +0900"
                },

 

아래 코드와 같이 json 파싱 코드를 적당한 곳에 넣으면 됩니다.

using Newtonsoft.json.Linq;

var parseJson = JObject.Parse(results);
var countsOfDisplay = Convert.ToInt32(parseJson["display"]);
var title = parseJson["items"][i]["title"].ToString();
var description = parseJson["items"][i]["description"].ToString();

  

이런 결과값을 얻을 수 있습니다.

 

전체 뉴스 검색 후 json 파싱 코드는 아래와 같습니다.

※ 네이버API을 이용한 뉴스 검색이기에 네이버 api ID, 비밀번호가 없으면 에러가 발생합니다.

using Newtonsoft.Json.Linq;
using System;
using System.IO;
using System.Net;
using System.Text;

namespace Naver_news
{
    internal class Program
    {
        static void Main(string[] args)
        {
            string _clientId = "네이버API ID";
            string _clientSecret = "네이버API 비밀번호";

            string query = "사고"; // 검색할 문자열
            string url = "https://openapi.naver.com/v1/search/news?query=" + query; // JSON 결과
            // string url = "https://openapi.naver.com/v1/search/blog.xml?query=" + query;  // XML 결과
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
            request.Headers.Add("X-Naver-Client-Id", _clientId); // 클라이언트 아이디
            request.Headers.Add("X-Naver-Client-Secret", _clientSecret);       // 클라이언트 시크릿
            HttpWebResponse response = (HttpWebResponse)request.GetResponse();
            string status = response.StatusCode.ToString();
            if (status == "OK")
            {
                Stream stream = response.GetResponseStream();
                StreamReader reader = new StreamReader(stream, Encoding.UTF8);
                string text = reader.ReadToEnd();
                //Console.WriteLine(text);

                var parseJson = JObject.Parse(text);
                var countsOfDisplay = Convert.ToInt32(parseJson["display"]);

                for (int i = 0; i < countsOfDisplay; i++)
                {
                    var title = parseJson["items"][i]["title"].ToString();
                    var description = parseJson["items"][i]["description"].ToString();
                    var link = parseJson["items"][i]["link"].ToString();
                    var pubDate = parseJson["items"][i]["pubDate"].ToString();

                    Console.WriteLine(string.Format("제목: {0}:", title));
                    Console.WriteLine(string.Format("내용: {0}:", description));
                    Console.WriteLine(string.Format("URL: {0}:", link));
                    Console.WriteLine(string.Format("작성일: {0}:", pubDate));
                    Console.WriteLine("\n");
                }
            }
            else
            {
                Console.WriteLine("Error 발생=" + status);
            }
        }
    }
}

 

위 코드 실행 결과값입니다.

 

댓글

💲 추천 글