2011-08-23 11 views
1

Visual C# 4.0의 백엔드로 /에서 JSON을 게시하고 가져 오는 응용 프로그램을 작성하고 있습니다.JavaScriptSerializer가 deserialization에서 ArgumentNullException을 throw합니다.

분명히, JSON을 serialize/deserialize하는 가장 쉬운 방법은 System.Web.Script.Serialization.JavaScriptSerializer이지만, ArgumentNullException을 던지는 곳에 이상한 오류가 발생하여 해당 유형이 null이라고 주장합니다. 다음 JSON가 역 직렬화

는 잘 작동 (중첩 사전)와 두번째 역 직렬화 때 종류가 null 오류가 함께

{"results":[ 
     {"Name":"Western Bulldogs", 
     "updatedAt":"2011-08-22T09:09:09.673Z", 
     "Nickname":"Bulldogs", 
     "RemoteId":44, 
     "Abbreviation":"WB", 
     "createdAt":"2011-08-22T09:09:09.673Z", 
     "objectId":"2iSK8FDTA6"} 
]} 

그러나, 실패. 원래 JSON 객체 때문에 모든 속성을 구현하지 않습니다 - 다음과 같이 ObjectIdContainerList가

JavaScriptSerializer jsSerialise = new JavaScriptSerializer(); 
ObjectIdContainerList contList = jsSerialise.Deserialize<ObjectIdContainerList>(responseString); 

은 (참고 : 참고로

{"results":[ 
    {"EndDate":{"iso":"2011-09-06T00:00:00.000Z","__type":"Date"}, 
    "Name":"Round 24", 
    "updatedAt":"2011-08-22T08:33:54.119Z", 
    "RemoteId":800,"createdAt":"2011-08-22T08:33:54.119Z", 
    "Season":{"className":"Season","__type":"Pointer","objectId":"WnsdqIlrd6"}, 
    "Order":24, 
    "StartDate":{"iso":"2011-08-30T00:00:00.000Z","__type":"Date"}, 
    "objectId":"bLdBfhagi9"} 
]}   

, 나는 두 쿼리에 대한 다음과 같은 방법으로 직렬화 복원 해요 I)는 OBJECTID 속성을 얻기에만 관심이 :

[Serializable] 
public class ObjectIdContainerList 
{ 
    public ObjectIdContainer[] results { get; set; } 
} 

[Serializable] 
public class ObjectIdContainer 
{ 
    public String objectId { get; set; } 
} 

첫 번째 쿼리는 정확히 동일한 코드 및 객체와 문제없이 deserialises.

제안 사항? JSON.NET으로가는 것이 가장 좋을까요?

+0

ObjectIdContainerList를 먼저 게시하고 가능한 경우 json 데이터를 누락하지 않고 게시하여 실제로 진행되고있는 작업을 볼 수 있습니다. –

답변

1

내 자신의 질문에 답하는 것이 좋지 않지만 Json.Net을 사용하여 거의 동일한 코드로 객체를 역 직렬화하여 문제를 해결하고 효과가있었습니다.

.Net Framework에서 버그라고 말하려는 것은 아니지만 그런 느낌입니다.

도와 주신 분들께 감사드립니다.

1

난 당신이 단순히이 작업을 수행 할 수 있어야 할 때 ObjectIdContainerList의 목적으로 무엇을 이해하지 않습니다

jsSerialise.Deserialize<List<ObjectIdContainer>>(responseString) 
and get a List of ObjectIdContainer 

나는 또한 ObjectIdContainer 문자열을 보유 "__type"라는 속성이 있는지 확인합니다. 그 이유는 그것이 C#의 클래스 속성에 이상한 이름이기 때문입니다.

편집 : 난 그냥 당신이

당신이 ObjectIdContainer 만라는 속성이 있습니다 ObjectIdContainer의 배열로 응답 문자열을 역 직렬화 할 수 있기를 기대 건가요 코드의 나머지 부분을 ... 게시 보았다 objectId? 나는 당신이 그 일을 할 수 있으면 감동 할 것입니다.

나는 Reflector가 JavascriptSerializer의 구현이 기본적으로 리플렉션을 사용하여 객체를 직렬화/역 직렬화한다는 것을 보았습니다. 따라서 JSON 객체에 정의 된 것과 동일한 속성 이름을 가진 해당 클래스가 필요합니다. 그렇지 않으면 실패합니다.

+0

실제로 처음에 시도했지만 실제로는 JSON 배열이 아니기 때문에 결과가 키이고 배열이 객체이기 때문에 사전이 작동하지 않습니다.질문에서 말했듯이 중첩 된 사전이없는 첫 번째 쿼리는 이러한 ObjectIdContainer와 함께 작동합니다. 나는 동의한다, 그것은 좋은 해결책이 아니다. 그러나 그것은 일한다 **. – Alastair

+0

하지만 첫 번째 경우에는 실제로 작동합니까? 나는 그것을 실행하지만 당신은 문자열 (예 : 2iSK8FDTA6)의 objectId 값을 캡처하고 Name, NickName 등과 같은 다른 모든 속성을 얻지 못한다고 가정합니다. Deserialize 메서드에서 반환 한 클래스를 검사 했습니까? 당신이 첫 번째 예에서 그것을 부를 때? 모든 속성에 대해 반환되는 모든 값은 무엇입니까? ObjectId에 대한 값 이상을 얻는 것에 대해서는 의심 스럽습니다. 그 이유는 그것이 C# 클래스에 상응하는 속성을 가진 유일한 개체이기 때문입니다. – Icarus

+0

다른 변수가 필요하지 않습니다. objectId 만 필요한 것입니다. 아마 이걸 좀 더 명확하게 만들 수 있었을거야, 미안해. – Alastair