2010-05-13 5 views
2

, 사전 직렬화과 같이 할 DataContractJsonSerializer 사용 :.NET : DataContractJsonSerializer를 사용하여 JSON 연관 배열로 직렬화 할 수 있습니까?

[CollectionDataContract] 
public class Clazz : Dictionary<String,String> {} 

    .... 

    var c1 = new Clazz(); 
    c1["Red"] = "Rosso"; 
    c1["Blue"] = "Blu"; 
    c1["Green"] = "Verde"; 

이 코드 C1 일렬 :

[{"Key":"Red","Value":"Rosso"}, 
{"Key":"Blue","Value":"Blu"}, 
{"Key":"Green","Value":"Verde"}] 

:

var dcjs = new DataContractJsonSerializer(c1.GetType()); 
    var json = new Func<String>(() => 
     { 
      using (var ms = new System.IO.MemoryStream()) 
      { 
        dcjs.WriteObject(ms, c1); 
        return Encoding.ASCII.GetString(ms.ToArray()); 
      } 
     })(); 

...이 JSON 생산 그러나 이것은 Javascript 연관 배열이 아닙니다. 내가 자바 스크립트에서 해당 일을 할 경우 사전을 제작 한 다음 같은, 직렬화 :

var a = {}; 
a["Red"] = "Rosso"; 
a["Blue"] = "Blu"; 
a["Green"] = "Verde"; 

// use utility class from http://www.JSON.org/json2.js 
var json = JSON.stringify(a); 

결과는 다음과 같습니다

{"Red":"Rosso","Blue":"Blu","Green":"Verde"} 

내가 DCJS 생산 또는 직렬화 된 문자열을 소비 얻을 수있는 방법 사전은 JSON2.js과 호환됩니까?


나는 ASP.NET에서 약 JavaScriptSerializer을 알고있다. 매우 WCF 친화인지 확실하지 않습니다. 그것은 DataMember, DataContract 특성을 존중합니까?

+1

JavaScriptSerializer는 DataMember와 DataContract를 모르기 때문에 걱정할 필요가 없습니다. –

답변

0

내가 올린 전화 a bug on MS Connect for the behavior I described above.

부탁하십시오.

+0

이것은 버그가 아닙니다. 이와 같은 직렬화가 필요한 경우 JavaScriptSerializer를 사용할 수 있습니다. DataContractJsonSerializer는 문자열뿐만 아니라 유형의 키를 지원하기위한 것입니다. 키 값 쌍의 배열은 사전을 직렬화하는 완벽하게 합법적 인 방법입니다. –

+0

누구나 의견을 낼 자격이 있습니다. 당신이 말한 것처럼 JSON 시리얼 라이저가 아닌 한 "완벽하게 합법적 인"것처럼 보입니다.이 경우에는 실패합니다. # 1 JSON 비 직렬화 라이브러리로 왕복하지 않습니다. JSON과 함께 작동하지 않으면 MS가 JSON 시리얼 라이저를 어떻게 호출 할 수 있는지 알지 못합니다. 일반성의 필요성을 이해하지만 키가 문자열 인 경우 꽤 명확한 최적화 경로가 있습니다. 그리고 속성을 사용하여이 최적화를 사용하기가 쉽습니다. 그럼에도 불구하고 MS는 버그를 "고치지 않을 것"으로 거부했습니다. 그들은 향후 시리얼 라이저를 향상시킬 수 있다고 언급했다. – Cheeso

2

JSON이하는 일은 완벽하게 의미가 있습니다. JSON은 JSON에서 .net 사전을 합리적으로 표현한 것입니다. 당신은 JSON 출력을 원한다면 당신은 당신이 단순히 객체 사실을 악용하는 자바 스크립트 연관 배열이 정말로 배열하지 않은 기억

public class ColourThingy 
{ 
     public string Red {get;set;} 
     public string Blue {get;set;} 
     public string Green {get;set;} 
} 
ColourThingy MyColourThingy = new ColourThingy(); 
MyColourThingy.Red = "Rosso"; 
... 

같은 클래스에는 직렬화 할 필요가 설명 [ "키"] 다스의 또 다른 방법입니다 ~에 object.key. 따라서 JSON으로 .net 사전을 serialize 할 때 예상대로 키/값 쌍 객체 배열을 생성합니다.

+0

JavaScript assoc 배열은 배열이 아닙니다. 그들은 * 사전입니다. DataContractJsonSerializer는 JSON2.js가 생성하는 양식을 사용하여 .NET 사전으로 비 직렬화 할 수 있습니다. 그 반대. DCJS에서 제작 한 JSON은 사전 내용을 충실하게 표현한 것입니다. JSON.js가 사전에 역 직렬화 할 수 없으므로 "합리적인"것에 대해 이의를 제기합니다. 4 줄짜리 js 함수는 그것을 바로 잡을 것이지만. . . DCJS가 처음에는 올바른 (상호 운용 가능한) 작업을 수행하는 것이 좋을 것입니다. – Cheeso

+1

JS assoc 배열은 사전이 아니라 단지 객체입니다. 사전/연관 배열 형식 구문 (예 : .xml)의 개체 속성을 참조 할 수있는 언어의 기능입니다. object [ "property"]뿐만 아니라 object.property. 네가 설명하는 방식으로 .net 사전을 직렬화한다면 사전 객체를 특별한 대소 문자로 구분하고 다른 모든 객체와 다르게 처리해야 할 것이다. 이것은 사전에 대한 식별자였던 자신 만의 클래스를 생성했다면 직렬화 할 것임을 의미한다. 한 가지 방법이지만 실제 dict을 사용하면 다른 방법으로 수행 할 수 있습니다. –

+0

JS 오브젝트는 사용자의 관점에 따라 사전이 될 수도 있고 그렇지 않을 수도 있습니다. 문제는 .NET의 JSON 직렬화 프레임 워크가 모든 JS 객체에 대해 미리 정의 된 유형을 필요로하는지 여부입니다. 나는 양측을 볼 수 있지만, JS를 다룰 때 좀 더 유연한 접근 방식을 선호한다. 왜냐하면 JS에서 고정 타입을 정의 할 방법이 없기 때문이다. 모든 객체를 확장 할 수 있으며 모든 속성 목록이 동적입니다. 따라서 동적 인 JS 객체와 인터페이스하기 위해 공식 .NET 유형을 요구하는 것은 부자연스럽고 인위적입니다. 사전은 의미가 있습니다. (나는이 모든 것으로 새로운 .NET 4.0 동적 유형을 고려하지 않았습니다.) – Cheeso

관련 문제