ConfigurationManager.appSettingsSerialize해서 다른 곳에 전송하는 것은 어떨까 하는 아이디어를 듣고 코드를 작성해 Json.NET을 사용해서 SerializeObject를 했다. appSettings는 NameValueCollection 클래스인데 Dictionary와 같이 serialize 될 것이라 예상했지만 결과는 키값만 배열로 반환했다.

var col = new System.Collections.Specialized.NameValueCollection(){
    {"a", "Hello"}, {"a", "World"}
};

Console.WriteLine(JsonConvert.serializeObject(col));
// return "[\"a\"]"

NameValueCollection은 하나의 키에 여러개의 값을 가질 수 있는 컬렉션이기 때문에 Dictionary와는 다른 형태로 serialize되도록 NameObjectCollectionBase에서 구현되어 있는 것으로 보인다.

Console.WriteLine(col["a"]);
// return Hello,World

동일한 키라도 각각의 값이 독립적으로 보장되야 한다면 조금 복잡해지겠지만 내 경우에는 위와 같이 ,로만 구분 되어도 큰 문제가 없는 상황이라서 Dictionary로 변환한 후에 Serialize하는 방법으로 문제를 해결했다.

var dict = col.AllKeys.ToDictionary(k => k, v => col[v]);

Console.WriteLine(dict["a"]);
// return Hello,World

Console.WriteLine(JsonConvert.serializeObject(dict));
// return "{\"a\":\"Hello,World\"}"

동일한 키에 여러개의 값을 가지는 상황이라면 JSON에선 키 아래 배열로 변환되어야 의미론에 더 맞는 것 같다. 위와 같은 방법 말고도 더 아름답고 쉽고 시멘틱한 방법이 있을 것 같은데…


GetValues(key)를 이용하면 string[]으로 반환해준다고 한다. how to convert NameValueCollection to JSONstring의 코드를 참고하면 되겠다.

웹사이트 설정

웹페이지 색상을 선택하세요