2016-06-08 2 views
0

시작하기 전에 JSON에 대한 경험이 거의 없다고 말해야합니다. 당신이이 프로젝트에 대한 보조 솔루션을 추구하는 것이 좋습니다 생각한다면이 내 경험의 모든,JSON.net 고유 한 유형의 비 직렬화

둘째 ... 자바 SnakeYaml와 함께왔다,

나는이 ... 알려 주시기 바랍니다 json 형식의 문자열을 받아들이고 요청 된 정보가 들어있는 json 형식의 문자열을 반환하는 TCP 서버. 여기에 그것이 할 일의 예가 있습니다.

요청

{ 
    'MyName': 'John Doe' 
    'MandatoryLookup': false 
} 

응답

{ 
    'John Doe': { 
     'Location' : 'Big Office Building' 
     'Additional': 'Floor 2' 
    } 
} 

이 부분이 제대로 작동 만 이해를 위해 제공됩니다.

응답을 제공하는 서버는 SQL 쿼리를 완료 한 후이 정보를 반환합니다. 내가하고 싶은 것은 디스크에있는 json 파일에 저장하는 것뿐만 아니라 메모리 내에이 쿼리를 저장하는 것입니다 (아래에 만들어진 커스텀 객체 사용). 서버가 부팅 될 때이 json 파일을 읽고 내 객체로 역 직렬화하고 싶습니다. 이렇게하면 매번 조회를 수행하는 대신 거의 즉시 응답을 반환 할 수 있습니다. 서버에 정보가 없거나 "MandatoryLookup"플래그가 true 인 경우 SQL 서버에 응답을 쿼리합니다.

public class DataContainer 
{ 
    public string UserName { get; set; } 
    public info LocationInfo locationInfo; 
} 

public class LocationInfo 
{ 
    public string BuildingName { get; set; } 
    public string AdditionalInfo { get; set; } 
} 

^아이디어는 위의이 아래의 JSON 문자열을 제공 맞다면 나도 몰라하지만 내가, 하위 범주에 대한 읽었다 다른 StackOverflow의 스레드로 이동 : 여기

는 사용자 지정 개체의 클래스입니다 .

RecentLookups.json 최고의 장소가 될 것입니다 무엇 세 가지 질문

  1. { 
        'John Doe' : { 
         'Location' : 'Big Office Building', 
         'Additional' : 'Floor 2' 
        }, 
        'Jane Doe' : { 
         'Location' : 'Small Office Building', 
         'Additional' : 'Security Office' 
        } 
    } 
    

    이 궁극적으로 분할 ((이것은 내가 시작시 구문 분석 디스크에 저장 한 파일)입니다) deserialization에 대한 객체의 형식을 지정하는 방법을 살펴볼 때 시작됩니다 (현재 작동하지 않는 방식이기 때문에).

  2. 형식화 된 sql 쿼리를 문제가되는 디스크에 미리 캐싱하는 것에 대해 걱정하고 있습니까? (SQL 조회가 매번 값을 검색 할만큼 빠르기 때문에)?
  3. 각 Json 그룹에 대해 고유하게 이름 지정된 DataContainer 개체를 프로그래밍 방식으로 만드는 방법은 무엇입니까? - 아래의 예

내 JSON 그룹의 이름은 반복 가능한 이름이 아닙니다. 즉, 'Jane Doe'와 같은 이름의 그룹은 없습니다. 대신 이러한 예제는 가독성을 위해 제공되었습니다. 실제 그룹 이름은 객체에 대한 고유 식별자이고 하위 카테고리 (위치, 추가)는 상기 객체에 대한 정보입니다. 내가 원하는 것은 각 DataContainer 객체가 JSON 카테고리 이름을 기반으로 고유 한 이름을 갖는 것입니다 (예 : 'Jane Doe'는 DataContainer JaneDoe이고 그 개체의 속성은 안으로 설정됩니다.

죄송합니다. 미리 감사드립니다.

+1

어떤 JSON 시리얼 라이저를 사용하고 있습니까? 대부분은 [이름이 ID 인 json 객체에서 강하게 유형화 된 C# 객체를 만듭니다] (https://stackoverflow.com/questions/34213566)의 줄을 따라'Dictionary '에 비 직렬화를 지원합니다. – dbc

+0

그것을 밖으로 떠나지 않았다 - 나는 newtonsoft에서 [json.net] (http://json.net)을 사용하고있다. –

답변

1

당신은 JSON하는 Dictionary<string, LocationInfo>에 역 직렬화 할 수

var dictionary = JsonConvert.DeserializeObject<Dictionary<string, LocationInfo>>(jsonString); 

Deserialize a Dictionary를 참조하십시오. 원하는 경우 그런 다음 최종 모델로 변환 할 수 있습니다

var list = dictionary.Select(pair => new DataContainer { UserName = pair.Key, locationInfo = pair.Value }).ToList(); 

을뿐만 아니라, 당신의 LocationInfo에서 C#을 마시고 속성 이름부터 받고있는 JSON의 이름과 일치하지 않는 수동으로 매핑을 설정해야 [JsonProperty] 속성 사용 :

public class LocationInfo 
{ 
    [JsonProperty("Location")] 
    public string BuildingName { get; set; } 
    [JsonProperty("Additional")] 
    public string AdditionalInfo { get; set; } 
} 
+0

뛰어난! 나는 foreach (KeyValuePair kvp in dictionary)'를 사용하여 결과를 볼 수 있었고, 각 부분을 가져올 수있었습니다. –

관련 문제