2012-09-12 2 views
9

잘 작동하는 다음 클래스를 사용하여 JSON 문자열을 루트 객체에 역 직렬화합니다.역 직렬화 중에 JSON.NET이 상속을 사용하지 않는 이유

[Serializable] 
    public class MoviesListRootObject 
    { 
     public int count { get; set; } 
     public Pagination pagination { get; set; } 
     public List<Response> response { get; set; } 
    } 

var json = wc.DownloadString(jsonRequestURL); 
var rootObj = JsonConvert.DeserializeObject<MoviesListRootObject>(json); 

을 ............................................. 그러나 내가 루트 클래스 bt를 생성하고 그것을 상속하는 루트 객체를 일반화한다면, 비 직렬화 후에 null이된다 !!

[Serializable] 
    public class RootObject 
    { 
     public int count { get; set; } 
     public Pagination pagination { get; set; } 
    } 

[Serializable] 
    public class MoviesListRootObject:RootObject 
    { 
     public List<MovieResponse> movieResponse { get; set; } 

    } 

........................................... ...

var json = wc.DownloadString(jsonRequestURL); 
var rootObj = JsonConvert.DeserializeObject<MoviesListRootObject>(json); 
+1

샘플 JSON 문자열을 포함하는 것이 더 좋습니다. –

+0

http://stackoverflow.com/a/6495299/146656에 나와있는 설정을 사용하거나 http : // stackoverflow에서 제안하는대로 [JsonObject (MemberSerialization.OptIn)]을 기본 클래스 선언에 적용하십시오. .com/a/6451204/146656 둘 다 실패하는 경우이 블로그 게시물 http://dotnetbyexample.blogspot.com.au/2012/02/json-deserialization-with-jsonnet-class.html에서 맞춤 방법을 확인하십시오. – Meligy

답변

0

가정 JSON 문자열은 내가 나와 함께 잘 작동 찾아 다음

{"movieResponse":[{"Rating":"Good"}],"count":1,"pagination":{"PageIndex":1}} 

것 같습니다. 당신이 경우 지금 당신이 클래스 구조가

[Serializable] 
public class MoviesListRootObject 
{ 
     public int count { get; set; } 
     public Pagination pagination { get; set; } 
     public List<Response> response { get; set; } 
} 

처럼 보인다 그리고 JSON 문자열 아래

{"count":1,"pagination":{"PageIndex":1},"response":[{"Rating":"Good"}]} 

같이 보입니다 그리고 때 현재 직렬화 된 객체를 Json.net 4.5 R11

을 사용하고 있습니다 새로운 구조체를 사용하여 역 직렬화하면 새 구조체에서 속성이 변경되므로 null movieResponse이 반환됩니다.

이 문제를 해결하려면 JsonConverter에서 파생되는 새로운 사용자 정의 jsonConverter를 만들고 프로그래밍 방식으로 개체를 만듭니다. 좋은 아이디어를 얻으려면 json-deserialization-with-jsonnet-class 링크를보십시오. 이 문제에 대해 이미 알고 있고 문제가 여전히 존재하는 경우, 사용 된 Json.net 버전, json 문자열, 완전한 클래스 구조 등의 세부 정보로 질문을 업데이트하십시오.

HTH.

JsonConvert.SerializeObject(graph, Formatting.None, new JsonSerializerSettings() { 
    TypeNameHandling = TypeNameHandling.All, 
    TypeNameAssemblyFormat = System.Runtime.Serialization.Formatters.FormatterAssemblyStyle.Simple 
}); 

Deserializing는 아래의 코드를 사용하기위한 : 직렬화 복원

4

그것은 매우 간단하고 json.net에서 제공하는 기본 지원에서, 당신은 단지 직렬화하는 동안 다음 JsonSettings를 사용해야하고 :

JsonConvert.DeserializeObject(Encoding.UTF8.GetString(bData), type, 
    new JsonSerializerSettings() { 
    TypeNameHandling = TypeNameHandling.All 
}); 

중요하게 생각되는 JsonSerializerSettings 객체 초기화 프로그램을 기록해 두십시오.