2014-01-06 5 views
2

불행하게도 JSON 데이터를 처리해야하므로 필연적으로 json.net을 기본값으로 사용합니다. 여기서 나는 '설명서'거래를 독점적으로 단순한 예제로 발견했습니다.실세계 JSON 데이터 비 직렬화

내 데이터에는 다음과 같은 '인스턴스'가 들어 있습니다.

"team" : [{ 
     "id" : "8", 
     "vendor-id" : "8", 
     "statsinc-id" : "8", 
     "team-name" : "", 
     "team-nickname" : "Pistons", 
     "rank" : "" 
    }, { 
     "id" : "51", 
     "vendor-id" : "29", 
     "statsinc-id" : "29", 
     "team-name" : "", 
     "team-nickname" : "Grizzlies", 
     "rank" : "" 
    } 
] 

이제는이 문자열/json 용어가 무엇이든 상관없이 많은 양의 다른 데이터가 있음을 명심하십시오.

세 가지 문제가 있습니다.

  1. 나는 설명서를 따르고 실제로 어떤 종류의 값을 내뱉을 수는 없었다. (나는 id 필드를 얻으려고했다).

  2. '속성'에는 하이픈이 들어 있습니다. C#은 변수/속성 이름에 하이픈을 허용하지 않으므로 어떻게 처리합니까?

  3. 위의 인스턴스에는 두 개의 '속성'이 있습니다. 아마도 후자가 객체에서 전자를 덮어 쓰는 것입니다. 개체 목록이 필요하고 어떻게 든 순차적으로 값을 삽입하는 방법을 찾아야합니까?

내가 모든 일이 불필요하게 복잡 찾아 도움을 절실히 필요로하므로입니다 - 그것은 물어 많은입니다하지만 사람이 어떻게 '팀 별명'모두를 얻기 위해 나를 보여줄 수 있다면 나는 것 밖으로 값 대단히 감사드립니다.

미리 감사드립니다. 다른 대답이 팀의 배열 그들이 그렇게 말했다으로

[JsonProperty(PropertyName = "team-name")] 
public string teamName { get; set; } 

[JsonProperty(PropertyName = "team-nickname")] 
public string teamNickname { get; set; } 

: 당신 같은 당신의 속성을 표시 할 것입니다 당신에게 직렬화 복원 될 예정 클래스를 생성 2. 관련하여

+0

아마 당신은 "불필요하게 복잡 전부"를 찾을 이유가 있기 때문에 당신의 질문은 JSON에 대한 오해를 잘 보여줍니다. "team"뒤에 오는 대괄호는 배열의 시작을 나타내므로 중복 항목은 중복되지 않으며 서로 다른 항목입니다. 비평하기 전에 좀 더 공부할 것을 권하고 싶습니다. w3c 사이트를 제안 해주세요 : http://www.w3schools.com/json/ ?? –

+0

각 유형에 대한 기본 객체를 만든 다음 deserialize하는 데 사용할 수있는 더 큰 객체에 composition on을 사용합니다. 또한 Dictionary >>을 사용하여 시도해 볼 수 있습니다. 첫 번째 사전은 목록에 기본 객체를 매핑합니다. 목록에는 내부 객체에 매핑되는 여러 사전이 포함되어 있습니다. – Carlos487

답변

8

이름 문제는 JsonPropertyAttribute을 사용하여 속성 이름이 무엇인지 지정해야합니다 (유추 할 수 없거나 다른 것으로 지정하려는 경우).

여러 항목이 있지만 둘 다 액세스 할 수 있도록 배열에 있습니다. 그들은 서로를 덮어 쓰지 않습니다.

JSONLint을 사용하면 JSON의 유효성을 검사하고 json2csharp을 사용하여 JSON을 기반으로 C# 클래스를 생성 할 수 있습니다.

JSON은있는 그대로 유효한 JSON이 아닙니다. 나는 그것을 객체를 만들기 위해 {}에 싸서 한 다음 이러한 클래스를 만들 수 있었다 :

public class RootObject 
{ 
    public List<Team> team { get; set; } 
} 

public class Team 
{ 
    [JsonProperty("id")] 
    public string Id { get; set; } 
    [JsonProperty("vendor-id")] 
    public string VendorId { get; set; } 
    [JsonProperty("statsinc-id")] 
    public string StatsIncId { get; set; } 
    [JsonProperty("team-name")] 
    public string TeamName { get; set; } 
    [JsonProperty("team-nickname")] 
    public string TeamNickname { get; set; } 
    [JsonProperty("rank")] 
    public string Rank { get; set; } 
} 

// this works! 
var obj = JsonConvert.DeserializeObject<RootObject>(data); 
var nicknames = obj.team.Select(x => x.TeamNickname); // "Pistons", "Grizzlies" 

내가 Team에서 (뿐만 아니라 하이픈 것들) 속성 이름을 모두 지정 JsonProperty 사용을되도록 I C#/.Net 표준 속성 대/소문자를 사용하여 올바르게 직렬화 및 비 직렬화 할 수 있습니다.

+0

Tricksy, 훌륭하게 작업하고 잘하면 정렬을 도와 주어야합니다. 나머지 데이터는 많은 감사합니다. – user1006221

3

"팀"개체의 다른 인스턴스로 deserialize합니다.

5

팀 개체의 클래스를 만듭니다 :

public class Team { 
    [JsonProperty(PropertyName = "id")] 
    public int ID {get;set;} 
    [JsonProperty(PropertyName = "vendor-id")] 
    public int VendorID {get;set;} 
    [JsonProperty(PropertyName = "statsinc-id")] 
    public int StatsIncID {get;set;} 
    [JsonProperty(PropertyName = "team-name")] 
    public string TeamName {get;set;} 
    [JsonProperty(PropertyName = "team-nickname")] 
    public string TeamNickname {get;set;} 
    [JsonProperty(PropertyName = "rank")] 
    public Rank {get;set;} 
} 

을 그런 다음 수행하여 JSON을 역 직렬화 할 수 있습니다

var listOfTeams = JsonConvert.DeserializeObject<List<Team>(inputString);