2014-12-28 2 views
1
나는이 JSON 직렬화 할 필요가

:C# JSON 풀어 재산

public class Resource 
{ 
    public ResourceId ResourceId { get; set; } 
    public string ResourceName { get; set; } 
    ... 
} 

public class ResourceId 
{ 
    public int UserId { get; set; } 
    public int ResourceId { get; set; } 
} 

내가 "RESOURCE_ID"의 값을 저장하기 위해 새의 ResourceId 객체를 생성하기 위해 디시리얼라이저가 필요합니다 :이 클래스에

{ "user_id": 0, "resource_id": 0, "resource_name": "file.xml" ...} 

을 및 "user_id". 또한 개체를 다시 직렬화해야합니다. 그게 가능하니?

저는 JSON.net 디시리얼라이저/시리얼 라이저를 사용하고 있습니다.

감사합니다.

+0

글쎄요, JSON 데이터는 RootObject에 포함 된 3 개의 값을 가지고 있습니다 ...하지만 JSON 데이터에는 경험이 없으며 VS에서 JSON 데이터를 붙여 넣기 만하면됩니다. – CularBytes

답변

0

먼저 ResourceId 클래스는 member names cannot be the same as their enclosing type이므로 컴파일되지 않습니다. 대신,이 같은 작업을 수행해야합니다

public class ResourceId 
{ 
    public int UserId { get; set; } 
    public int Id { get; set; } 
} 

당신의 다음에 문제가 포함 된 클래스 ResourceId의 속성은 컨테이너 클래스 Resource의 특성으로 JSON에 등장하고 있다는 점이다.

[DataContract] 
public class Resource 
{ 
    [IgnoreDataMember] 
    public ResourceId ResourceId { get; set; } 

    [DataMember(Name="user_id")] 
    private int? user_id { 
     get 
     { 
      return ResourceId == null ? (int ?)null : ResourceId.UserId; 
     } 
     set 
     { 
      if (value == null) 
      { 
       ResourceId = null; 
      } 
      else 
      { 
       if (ResourceId == null) 
        ResourceId = new ResourceId(); 
       ResourceId.UserId = value.Value; 
      } 
     } 
    } 

    [DataMember(Name="resource_id")] 
    private int? resource_id 
    { 
     get 
     { 
      return ResourceId == null ? (int?)null : ResourceId.Id; 
     } 
     set 
     { 
      if (value == null) 
      { 
       ResourceId = null; 
      } 
      else 
      { 
       if (ResourceId == null) 
        ResourceId = new ResourceId(); 
       ResourceId.Id = value.Value; 
      } 
     } 
    } 

    [DataMember(Name="resource_name")] 
    public string ResourceName { get; set; } 
} 

특성이 있어야한다 : 데이터 모델을 변경하지 않고이 에 대처하는 가장 좋은 방법은 컨테이너 클래스에 개인 특성 프록시과 같이 기본 ResourceId의 특성,로 직렬화하는 것입니다 null이 가능한 값일 때 실제로 개별적으로 변경하는 것이 의미가 없으므로 비공개로 설정하십시오. 예를 들면 다음과 같습니다.

예기치 않은 결과가 발생할 수 있습니다.

대신 [DataContract]

, [IgnoreDataMember][DataMember], 하나는 [JsonIgnore][JsonProperty]를 사용할 수 있습니다. 데이터 계약 속성을 사용하면 클래스가 데이터 계약자 직렬화 기와 호환 될 수 있으므로 유용 할 수 있습니다.

+1

그게 내 문제를 해결했습니다. 고맙습니다! –