재우니의 블로그

JSON object 를 C# object 로 변환하기

 

 

 

 

public class MyDate
{
    public int year;
    public int month;
    public int day;
}

public class Lad
{
    public string firstName;
    public string lastName;
    public MyDate dateOfBirth;
}

class Program
{
    static void Main()
    {
        var obj = new Lad
        {
            firstName = "Markoff",
            lastName = "Chaney",
            dateOfBirth = new MyDate
            {
                year = 1901,
                month = 4,
                day = 30
            }
        };

        //c# model 을 json 문자열로 변환하기(Serializing to Json String)
        var jsonString = Newtonsoft.Json.JsonConvert.SerializeObject(obj);

        //json 문자열을 c# model 에 담아 사용하기(Deserializing to Object)
        var obj = Newtonsoft.Json.JsonConvert.DeserializeObject<Lad>(jsonString );
    }
}

 

 

https://stackoverflow.com/a/44670447

 

How do I turn a C# object into a JSON string in .NET?

I have classes like these: class MyDate { int year, month, day; } class Lad { string firstName; string lastName; MyDate dateOfBirth; } And I would like to turn a Lad object into a...

stackoverflow.com


 

json 형태 문자열을 c# model 형태로 추출하기

public class User
{
    public User(string json)
    {
        JObject jObject = JObject.Parse(json);
        JToken jUser = jObject["user"];
        name = (string) jUser["name"];
        teamname = (string) jUser["teamname"];
        email = (string) jUser["email"];
        players = jUser["players"].ToArray();
    }

    public string name { get; set; }
    public string teamname { get; set; }
    public string email { get; set; }
    public Array players { get; set; }
}

// Use
private void Run()
{
    string json = @"{""user"":{""name"":""asdf"",""teamname"":""b"",""email"":""c"",""players"":[""1"",""2""]}}";
    User user = new User(json);

    Console.WriteLine("Name : " + user.name);
    Console.WriteLine("Teamname : " + user.teamname);
    Console.WriteLine("Email : " + user.email);
    Console.WriteLine("Players:");

    foreach (var player in user.players)
        Console.WriteLine(player);
 }

 

 

Newtonsoft.Json.JsonConvert.DeserializeObject() 활용하여 간략하게 한 줄 표현으로도 가능 합니다.

Mycustomclassname oMycustomclassname = Newtonsoft.Json.JsonConvert.DeserializeObject<Mycustomclassname>(jsonString);

 

Model 이 없을 경우 dynamic 키워드를 사용해도 됩니다.

var oMycustomclassname = Newtonsoft.Json.JsonConvert.DeserializeObject<dynamic>(jsonString);

 

참고사이트 

https://stackoverflow.com/a/28061832

 

How to Convert JSON object to Custom C# object?

Is there an easy way to populate my C# Object with the JSON object passed via AJAX? This is the JSON Object passed to C# WEBMETHOD from the page using JSON.stringify { "user": { ...

stackoverflow.com


 

https://json2csharp.com/사이트 활용해 보기

 

아래와 같은 json 형태의 내용이 있다고 합시다.

{
    "dataSearch": {
        "content": [
            { "lClass": "기타", "facilName": "복지서비스과", "majorSeq": "42", "mClass": "가정관리", "totalCount": "56" },
            {
                "lClass": "가정보건복지",
                "facilName": "간호과, 보건간호과, 보건복지과, 의료서비스과, 한방자원과, 보건경영과, 치의보건간호과, 보건계열, 보건비즈니스과, 간호복지학과, 보건행정과, 한방보건간호과, 간호경영과, 복지비즈니스과, 간호회계과, 국제의료관광간호과, 보건간호공통과, 보건복지행정과, 보건회계과, 세무보건행정과, 치의간호과, 보건간호계열, 보건의료서비스과",
                "majorSeq": "45",
                "mClass": "간호",
                "totalCount": "56"
            },
            {
                "lClass": "공업",
                "facilName": "건설과, 건설기계과, 건설디자인과, 친환경건설과, 지오매틱스과, 건설시스템과, 건설환경과, 도시설계과, 지형공간디자인과, 해외건설전기통신과, 해외시설물건설과, 드론도시설계과, 드론지형정보과",
                "majorSeq": "16",
                "mClass": "건설",
                "totalCount": "56"
            },
            { 
                "lClass": "기타", 
                "facilName": "환경화학공업과, 환경과학과, 생명환경화공과, 환경과, 환경산업과", 
                "majorSeq": "41", 
                "mClass": "환경", 
                "totalCount": "56" }
        ]
    }
}

 

해당 사이트에 들어가서 "Convert Json to C#" 에서 convert 하면 아래와 같은 예제를 제공해 줍니다.

// Root myDeserializedClass = JsonConvert.DeserializeObject<Root>(myJsonResponse);
    public class Content
    {
        public string lClass { get; set; }
        public string facilName { get; set; }
        public string majorSeq { get; set; }
        public string mClass { get; set; }
        public string totalCount { get; set; }
    }

    public class DataSearch
    {
        public List<Content> content { get; set; }
    }

    public class Root
    {
        public DataSearch dataSearch { get; set; }
    }

 

위의 model class 를 기반으로 web api (https://www.career.go.kr/) 를 호출하면 위와 같은 json 형태의 데이터를 제공해 주며, C# 에서 json parse 를 제공해 주는 Newtonsoft.Json 을 참조하여 foreach 구문으로 cvs 형태로 문자열을 만들어 file 를 create 해서 받아 볼 수 도 있습니다. 

private static async Task CallMajorAsync(int thisPage, string gubun, string csvFileName)
{
    var svcCode = "MAJOR";
    var perPage = "100";

    var targetApiUrl = apiUrl + $"&svcCode={svcCode}&gubun={gubun}&perPage={perPage}&thisPage={thisPage}";
    using (var client = new HttpClient())
    {
        client.BaseAddress = new Uri(targetApiUrl);
        client.DefaultRequestHeaders.Accept.Clear();
        client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

        //GET방식
        HttpResponseMessage response = await client.GetAsync(targetApiUrl);
        if (response.IsSuccessStatusCode)
        {
            var jsonString = await response.Content.ReadAsStringAsync();
            //File.WriteAllText(@"D:/log.txt", jsonString, System.Text.Encoding.Default);

            //var welcome = MAJOR.Welcome.FromJson(jsonString);

            var modelMajor = JsonConvert.DeserializeObject<Models.Major.Root>(jsonString);
            var lines = new List<string>();

            var lclass = "";
            var facilName = "";
            var majorSeq = "";
            var mClass = "";

            //국방과학기술학부,국방기술학과\r\n(대학교),국방기술학부,국방디지털융합학과,국방무기체계학과,국방학과
            foreach (var info in modelMajor.dataSearch.content)
            {
                lclass = info.lClass.Replace(",", "/").Replace(System.Environment.NewLine, string.Empty);
                facilName = info.facilName.Replace(",", "/").Replace(System.Environment.NewLine, string.Empty);
                majorSeq = info.majorSeq;
                mClass = info.mClass.Replace(",", "/").Replace(System.Environment.NewLine, string.Empty);

                lines.Add(string.Join(",",
                    lclass,
                    facilName,
                    majorSeq,
                    mClass));
            }

            File.AppendAllLines(@"D:/" + csvFileName, lines, System.Text.Encoding.Default);
        }
        else
        {
            Console.WriteLine("Internal server Error");
        }
    }
}