C# Dictionary<string, object> value 값 추출후 object[] 변환

api 서버를 만드는중에 요청들어오는 데이터와 그걸통해 응답받는 데이터를 비교해서 list 안에 담아야 합니다

요청전문은 Dictionary<string, object>형식으로 들어오고

{
  "Name": "",
  "Tel": "",
  "array": [
    {
      "GroupID": "0001",
      "CodeID": "01",
      "Value": "1"
    },
    {
      "GroupID": "0001",
      "CodeID": "02",
      "Value": "1"
    },
    {
      "GroupID": "0001",
      "CodeID": "03",
      "Value": "1"
    },
    {
      "GroupID": "0001",
      "CodeID": "04",
      "Value": "1"
    }
  ]
}

이렇게 들어오는데 나는 요청 전문에 데이터중 array의 value값만 추출 해서 object[] 형식으로 바꾸고 싶습니다
array은 JArray 형식으로 되어있습니다

var arr = param.Values .Where(d => d.GetType() == typeof(object[])) .Single() as Object[];
나는 value 값을 이런식으로 추출할려고 하는데 오류가 나고 있습니다.

jarray 형식을 object[] 형식으로 변환하는 방법을 알고 싶습니다

좋아요 2

간단하게 처리 하실려면 Dynamic으로 처리 하실 수 있습니다.

var json = "{ \"Name\": \"\", \"Tel\": \"\", \"array\": [ { \"GroupID\": \"0001\", \"CodeID\": \"01\", \"Value\": \"1\" }, { \"GroupID\": \"0001\", \"CodeID\": \"02\", \"Value\": \"1\" }, { \"GroupID\": \"0001\", \"CodeID\": \"03\", \"Value\": \"1\" }, { \"GroupID\": \"0001\", \"CodeID\": \"04\", \"Value\": \"1\" } ] }";

var converter = new ExpandoObjectConverter();
var jObject = JsonConvert.DeserializeObject<ExpandoObject>(json, converter) as dynamic;

var array = jObject.array;  // [ {"GroupID": "0001", "CodeID": "01", "Value": "1"....} ...]
var arrayLen = array.ToArray().Length;  // 4
var groupID = array[0].GroupID;  // 0001

직접 VO 클래스를 명시적으로 정의해서 디시리얼라이즈 하셔도 됩니다.

※ 위 샘플 코드는 닷넷 Newtonsoft 라이브러리를 이용하였습니다.

좋아요 4

아 참고로 질문 내용중
‘value 값만 추출’ 이라는게

json 데이터중 array키 배열 데이터안에 있는 value만 뽑는 거라면 다음과 같이 하시면 됩니다.

object[] values = array.ToArray();
values.SelectMany( p => ((IDictionary<String, Object>)p).Values)  // ["0001", "01", "1", "0001", "02", "1" ....]

참고하시길 바라고 위 방법은 위 코드를 응용한 방식이고 기타 다른 방법으로도 여러가지가 있습니다.

좋아요 2

답변 감사합니다 혹시 { “GroupID”: “0001”, “CodeID”: “04”, “Value”: “1” } 이 데이터의 Value값 즉 "1"이라는 데이터만 뽑고 싶을때는 어떻게 해야하나요?

좋아요 1

제가 첫번째 답변에 단것 처럼 하시면 안되나요?

좋아요 1

전문 데이터가 Dictionary<string, object> 형식으로 되어있는데 이걸

var json = "{ \"Name\": \"\", \"Tel\": \"\", \"array\": [ { \"GroupID\": \"0001\", \"CodeID\": \"01\", \"Value\": \"1\" }, { \"GroupID\": \"0001\", \"CodeID\": \"02\", \"Value\": \"1\" }, { \"GroupID\": \"0001\", \"CodeID\": \"03\", \"Value\": \"1\" }, { \"GroupID\": \"0001\", \"CodeID\": \"04\", \"Value\": \"1\" } ] }";

이런 형식으로 바꿀수 있는건가요?

좋아요 1

전문 데이터가 Dictionary<string, object>로 들어오는 게 맞나요? raw string 형태를 보나 api 통신인 점을 보나 json 형태 같은데요. jarray 객체라고 하시면 Newtonsoft.Json을 쓰시는 것 같은데, json string에서 Newtonsoft.Json의 json 객체로 바꾸는 건 해당 객체에 값을 할당하는 코드를 따라 올라가면 아마 아래처럼 Deserialize 하는 코드가 있을 것 같습니다.

좋아요 2

답변감사합니다 점문데이터는 Dictionary<string, object>들어오는게 맞으며 디버그시 이미지처럼 들어옵니다
image
image
key값이 array인 value 값을 추출하고 싶은데 잘 모르겠네요

좋아요 1

var array = jObject.array; // [ {“GroupID”: “0001”, “CodeID”: “01”, “Value”: “1”…} …]
var arrayLen = array.ToArray().Length; // 4
var groupID = array[0].GroupID; // 0001

이거 아닌가요?

좋아요 2

알려주신대로 해볼려고 합니다 그전에 Dictionary<string, object> 들어오는 데이터를 string 변환해야 할것 같아 다시 질문 드렸습니다

좋아요 1

정확히 어떤 상황인지 모르겠어서 원하는 프로퍼티의 값을 가져오는 부분만 첨부합니다.

var json = "{ \"Name\": \"\", \"Tel\": \"\", \"array\": [ { \"GroupID\": \"0001\", \"CodeID\": \"01\", \"Value\": \"1\" }, { \"GroupID\": \"0001\", \"CodeID\": \"02\", \"Value\": \"1\" }, { \"GroupID\": \"0001\", \"CodeID\": \"03\", \"Value\": \"1\" }, { \"GroupID\": \"0001\", \"CodeID\": \"04\", \"Value\": \"1\" } ] }";
var jObj = JObject.Parse(json);
int index = 0; // array에서 값을 가져올 인덱스
var token = jObj["array"][index]["Value"];
string value = token.ToString();

Newtonsoft.Json에서 json raw string으로부터 Value 값만 가져오시려면 이렇게 해도 되는데 대소문자를 구분하고 프로퍼티 이름이 바뀔 때 능동적으로 대처할 수 없는 단점이 있습니다.

좋아요 2

바쁘신 와중에 정말 답변 감사합니다 한가지 문제는 알려주신 코드에서 json 처럼 string 형으로 변환 할려고 하는데 Dictionary<string, object> 형식에서 string 형식으로 변환이 잘 안되서 문제가 발생하는것 같습니다

좋아요 1

json을 param으로 파싱하는 부분을 첨부해 주셔야 알 것 같습니다. 메소드라면 메소드를 호출해 인수를 전달하는 다른 부분 어딘가에 json을 파싱해주는 부분이 있을 겁니다.

좋아요 2