2012-04-17 5 views
4

먼저 이므로 JSON 역 직렬화에 대해 다른 질문이 있으시면 죄송합니다. 나는 이것에 대한 대답을 보지 못했다.JSON을 "기본 제공"유형으로 비 직렬화하는 방법

I는 T 같이 재귀 정의 T에 JSON 직렬화 싶습니다

  • Dictionary<string, T>
  • T[]
  • string
  • 기본 유형
  • (object)T (박스)

많은 JSON 라이브러리가 deserialized 형식을 지정할 수 있지만 내 경험상 일부 사용자 정의 형식 (JObject, JsonObject, 뭐든간에)이 어딘가에 개체 그래프에 나타납니다 (즉, 반환 형식이 특정 깊이에 적용). 타입 맵핑은 자바 스크립트로 거의 일대일로 이루어지기 때문에 직감적 인 것처럼 보입니다.

편집

적으로는, 내가이입니다 "깨끗한"가되도록 JSON을하고 싶습니다, 특별한 필드 ("__type"등) 직렬화 복원에 도움이 없습니다. 자바 스크립트에서 직접 매핑해야합니다 : JObject ->IDictionary<string, T>, JArray ->T[] 등등.

그동안 FParsec 파서와 핸드 롤링 시리얼 라이저를 사용하고 있습니다. 그것은 훌륭하게 작동하지만, 이미 거기에 이것에 대한 것이있을 것이라고 생각했습니다.

+0

Newtonsoft.JSON을 사용해 보셨습니까? (http://james.newtonking.com/pages/json-net.aspx) 이것은 ravenDB에서 사용하고 deserialization 중에 문제가 발생하지 않았습니다. – wal

+0

네, 그 순간에 제가 사용하고있는 것이고'JObject'는 항상 중첩 된 객체 그래프에 나타납니다. – Daniel

+1

몇 가지 예제 코드와 입력 데이터를 제공 할 수 있습니까? – Timmerz

답변

0

나는 "내가 T를 재귀 적으로 정의한 T로 JSON을 deserialize하고 싶습니다."라고 말한 것에 대해서는 확신하지 못합니다. "제 가정은 당신이 어떤 것을 직렬화하고 역 직렬화 할 수 있기를 원한다는 것입니다. 유형을 조합하여 사용할 수 있습니다.

내 경험에 따르면 System.Runtime.Serialization.JsonDataContractJsonSerializer에있는 표준 DotNet 라이브러리가 사용자가 설명하는 작업에 더 적합하며 사용자가 언급 한 모든 유형 (메타 데이터 설명 없음)을 성공적으로 처리 할 수 ​​있습니다. T의 boxed 객체. 그러나 내 가정은 메타 데이터를 제공하지 않고 T의 boxed 객체를 처리 할 수있는 라이브러리가 없다는 것입니다 (어떻게 할 수 있습니까? 객체에 대해서는 아무것도 모릅니다).

다음은 일부 코드입니다. 내 애플 리케이션에

public class JSONSerializer<T> 
{ 

    public static string Serialize(T obj) 
    { 
     DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(T)); 
     using (MemoryStream stream = new MemoryStream()) { 
      serializer.WriteObject(stream, obj); 
      return Encoding.Default.GetString(stream.ToArray()); 
     } 
    } 

    public static T Deserialize(string json) 
    { 
     DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(T)); 
     using (MemoryStream stream = new MemoryStream(Encoding.Default.GetBytes(json))) { 
      return (T)serializer.ReadObject(stream); 
     } 
    } 

} 

PS를 직렬화를 제공하기 위해 사용 또한 DataContractSerializer가 (아마 어딘가에 내부적으로, 출력 또는 입력에 적어도) 프록시 타입의 객체를 사용하지 않고 "순수"직렬화 및 역 직렬화를 않습니다.

+0

'IDictionary '를 구현 한 클래스를 직렬화하려고 시도하고 barfs가 발생했습니다. 그것은'typeof (Dictionary ) 대신에 런타임 타입 ('this.GetType()'을 검사해야합니다.) IsAssignableFrom (type)'. – Daniel

-1

제네릭을 사용할 수 없습니다. 왜냐하면 generic은 하나의 단일 유형에서 제거 된 컴파일 시간이어야하기 때문입니다. 하지만 JSON 개체 또는 배열 값은 모든 JSON 형식이어야하며 이는 사실입니다.

하지만 원하는 경우 object을 사용하여 전송할 수 있습니다. JSON 배열은 object[]이고 JSON 개체는 Dictionary<string,object>입니다. 그러나 이것은 언급 한 사용자 정의 유형의 변형 일뿐입니다.

관련 문제