c#에서 api로 json 형식 스트링 받았을 때, 이 string을 활용하는 방법을 알고 싶습니다.

문제 해결, 다만 데이터가
“{\“datavalue”:[\“value1\”,\“value2\”],\“successvalue\”:3}”
이렇게 배열과 섞여서 나올 때에는 역직렬화를 2번 진행함

string result = JsonConvert.DeserializeObject(responseFromServer);
ResultInfo result2 = JsonConvert.DeserializeObject< ResultInfo >(result);

=======================================================

안녕하세요

현재 C# 다른 곳에서 web api를 호출 받아서 이를 제가 원하는 클래스 타입(예시 : intType 모델)에 맞춰 사용하고자하는데요.

다른 곳에서 호출 받아온 string은 아래와 같습니다.
“{“datavalue”:[“value1”,“value2”],“successvalue”:3}” (string 형식)

여기서 제가 예시로 intType란 클래스를 만들었을 때
public class intType
{
int num {get; set;}
string message { get; set; }
}

여기서 제가 다른 곳에서 intType타입으로 데이터를 만들 때,
위의 num은 제가 호출한 string에서 successvalue 값인 3을 꺼내어서 넣고 싶은데, string 형식에서 어떻게 이 값을 꺼내놓을 지 잘 모르겠습니다…

아래는 제가 작성한 컨트롤러를 보여드리겠습니다.

public ActionResult Index(int? id)
    {

        ViewBag.Idx = id;
        string responseFromServer = string.Empty;

        //  기본 1
        WebRequest request = WebRequest.Create("http://localhost:8096/api/values/1");

        if (id == 3)
        {
            request = WebRequest.Create("http://localhost:8096/api/values/3");
        }
        else if (id == 2)
        {
            request = WebRequest.Create("http://localhost:8096/api/values/2");
        }

        request.Method = "GET";
        request.ContentType = "application/json";


        using (WebResponse response = request.GetResponse())
        using (Stream dataStream = response.GetResponseStream())
        using (StreamReader reader = new StreamReader(dataStream))
        {

            responseFromServer = reader.ReadToEnd();


        }


        return View();
    }

이 과정에서 어떤 점을 바꿔야할 지 자문 주시면 감사하겠습니다…!! (–)(__)

좋아요 1

Json.NET을 이용하셔서 직렬화, 역직렬화를 이용하시면 쉽게 가능하실 것 같습니다.

좋아요 2

일일이 꺼내서 intType의 인스턴스에 넣어 줘도 되나 Vincent님의 말 처럼 역직렬화를 하는게 가장 간단하고 쓰기 쉽습니다.

JSON 문자열의 형태와 동일한 클래스를 만드세요.

public class ResultInfo
{
    public string[] DataValue { get; set; }
    public int SuccessValue { get; set; }
}

위의 클래스명은 nywoo님이 원하시는 것으로 하시면 되나, 속성명은 위의 데이터와 맞추는게 좋습니다. (attribute로 이를 변경할 수 있으나 되도록 이면 맞추시는게 코딩 가독성은 좋은 것 같습니다.)

이제 API에서 최종 JSON 문자열을 얻으신 후, 다음의 코드로 위 클래스의 인스턴스를 얻으실 수 있습니다.

using Newtonsoft.Json;

var jsonData = @"
{
   ""datavalue"": [""value1"", ""value2""], ""successvalue"": 3
}
";

Console.WriteLine(jsonData);


var result = JsonConvert.DeserializeObject<ResultInfo>(jsonData)!;

Console.WriteLine(result.SuccessValue);

var value = new intType { num = result.SuccessValue };


class ResultInfo
{
    public string[] DataValue { get; set; } = default!;
    public int SuccessValue { get; set; } = default!;
}

class intType
{
    public int num { get; set; }
    public string message { get; set; }
}

Newtonsoft.Json으로 테스트 했습니다.

※ 참고로 클래스명 및 속성명은 대문자로 시작하는게 좋습니다.

좋아요 4

디모이님 친절한 설명 정말 감사합니다 말씀대로 수정진행 먼저 해보겠습니다.
클래스명은 대문자로 변경하겠습니다.

하나만 더 여쭤봐도 될까요?
만약에 넘어오는 josn stirng이 ctionResult Index(int? id)에서 넘겨져오는 id값에 따라 형식이 달라질 때에는 양이 5가지 이하일 때에는 클래스를 만들고, 이후에는 바뀌는 형식에 바로 넣는 방법을 찾는게 더 좋을까요?

저 같은 경우는 수와 상관없이 개별 클래스를 만들어 줍니다. 처음에는 번거롭지만, 이후 코드 가독성은 훨씬 좋아집니다. 하지만 정답은 없고요 무엇을 선호하느냐에 따른 것 같습니다.

좋아요 1

넵 의견 감사합니다 ^^!

dimohy님, dimohy 코드대로 해보았는데, 아무래도 ResultInfor의 string[]값 때문인지 오류가 나는 것 같습니다. 이 부분 더 찾아보고 해결 방법 찾게 되면 본문에 추가해보겠습니다.

"{\“datavalue\”:[\“value1”,\“value2\”],“successvalue\”:3}"값이 이렇게 나오기 때문인 것 같습니다…ㅠㅠ

[C# ] 요소수 중점 유통 주유소 재고현황 API 조회 (tistory.com)

제가 가볍게 조회용으로 만들어 본건데 참고해보셔도 좋을 것 같아요.
전 System.Text.Json 사용하거든요. net framework에서 사용하시려면 nuget으로 참조하셔도 돼요.

        [JsonPropertyName("page")]
        public int Page { get; set; }

위 코드처럼 page, Page가 있는데 직렬화, 역직렬화 할 때 사용할 파라미터 이름을 설정가능합니다.
따로 필요 없다면 아래 옵션을 추가하셔도 돼요!

new JsonSerializerOptions() { PropertyNameCaseInsensitive = true } 
좋아요 1

오류가 없는 코드를 올렸어서… 아마 C# 버젼의 문제가 아닐까 생각하는데요 어떤 오류가 나는지 알려주면 도움을 드릴 수 있을 것 같아요

저는 .NET 6 C# 10으로 확인했어요

좋아요 1

괜찮습니다. 제 실수로 글을 복사할 때 확인을 못했습니다.
슬래쉬를 2개 넣어야 제대로 데이터가 나왔을 텐데.!ㅎㅎ

“{\“datavalue”:[\“value1\”,\“value2\”],\“successvalue\”:3}”

이렇게 나오던 데이터는
string result = JsonConvert.DeserializeObject(responseFromServer);
ResultInfo result2 = JsonConvert.DeserializeObject(result);

이렇게 처음에 스트링으로, 두번째에 클래스 타입으로 바꾸었습니다.
부족한 점이 많아 좀 헤맸지만, 알려주신 JsonConvert.DeserializeObject<>() 방법으로 해결했습니다 ^^

좋아요 1

오 그렇군요…! 더 많이 공부해봐야겠네요.
보내주신 블로그 참고해서도 만들어보고 궁금한 점 생기면 답글 남겨보겠습니다.

감사합니다 ^^