2014-11-20 1 views
0

내 배경은 수년간 동적 언어로되어 있기 때문에 키/값이 다른 유형이 될 수있는 JSON에서 정적 유형의 언어가 데이터를 얻는 방법에 대한 추론이 실제로 문제가되고 있습니다. 여기에 데이터의 예 내가 가진 :JSON에서 값을 변환/변환하는 방법은 무엇입니까?

{ 
    "par": 4, 
    "level": [0,1,0,1,1, 0,1,0,1,1, 0,1,0,1,1, 0,1,0,1,1, 0,1,0,1,1] 
} 

그리고 나는 구문 분석을 할 MiniJSON.cs을 사용하고이

int par; 
List<bool> levelData; 

같은 일부 지역 변수에이를 얻으려면, 그리고 그것을 제공 나를 다시 Dictionary<string, object>하지만 나는 파 및 수준 값을 얻는 방법을 알아낼 수 없습니다 실제로 그들이 나타내는 다른 유형으로 변환합니다.

+1

디버거에서 사전의 내용을 보면, 무엇이 당신에게 보여 집니까? 필자는'par '의'int'와'level'의'int []'라고 생각합니다 ...하지만 그것은 단지 추측입니다. –

+0

'int par = (int) jsonDictionary [ "par"]'와 같은 데이터를 가져 와서 키로 retieve하고 올바른 유형으로 변환합니다. 실제 유형의 데이터가 무엇인지 알아 내기 위해 시행 착오 디버깅을해야 할 수도 있습니다. –

답변

0

List<int>으로 변환 할 때의 문제점은 MiniJSON이 정수를 Int64으로 구문 분석하고 int이 32 비트이므로 데이터 손실로 인해 변환이 암시 적으로 허용되지 않는다는 것입니다. Int64 목록으로 변환했습니다.

List<Int64> cells = (List<Int64>)data["level"]; 
-1

사전을 유형이 지정된 데이터 구조로 변환하는 "디코더"를 제공해야합니다. 부울 값을 나타내는 데 01을 사용하고 있기 때문에 특히 분명합니다.

클래스 SomeClass에 입력 한 데이터가 있다고 가정합니다. 디코더는 이런 식으로 뭔가를해야 할 것 :

SomeClass decode(Dictionary<string,object> d) { 
    var m = new SomeClass(); 
    m.par = (int)d["par"]; 
    m.levelData = ((List)d["level"]).Select(x => (int)x == 0 ? false : true).ToList(); 
    return m; 
} 

그래서, 기본적으로는 (지정되지 않은)를 설정해야합니다 입력 값으로 개체를, 당신은 명시 적으로 그렇게해야합니다. 여기서는 0과 1의 목록이 동 질적이라고 가정합니다 (즉, 문자열과 같이 "동적 인 유형의 언어에서 완벽하게 합법적 인"이상한 값을 포함하지 않음).

+0

'(List) d [ "level"]'할 때 List에 포함 할 타입을 지정하지 않았다는 것을 알아 채 셨습니다. – ironfroggy

관련 문제