2010-07-08 3 views
0

-edit- 속성을 사용하여 해결책이 있습니까?.NET json [1,2, "three"]을 처리하는 가장 좋은 방법

나는 이상한 json을 발견했다. 아래 문자열과 같습니다. 내가 그것을 처리 할 생각할 수있는 유일한 방법은 개체 배열을 사용하는 것입니다. int와 문자열이 아래 배열로 섞여있는 것을 본 적이 없습니다.

그럼 저는 강제로 형 변환합니다. int와 문자열을 얻는 더 좋은 방법이 있습니까?

참고 : 첫 번째 배열에는 0-20 개의 요소가있을 수 있습니다. 내부의 배열에는 항상 3이 있고 처음 두 개는 int이고 세 번째는 문자열입니다. 어쩌면 내가이 지식을 내 이점으로 사용할 수 있을까?

{ 
var ser = new JavaScriptSerializer(); 
var o = ser.Deserialize<RootObj>(@"{""resources"": [[123,567,""<div ...""]]}"); 
var o2 = o.resources[0]; 
var v = (int)o2[1]; 
var sz = (string)o2[2]; 
} 
class RootObj { 
public object[][] resources; 
} 
+1

잘못된 입력, 잘못된 출력. 내 지식으로는 잘못된 json을 생성하는 프로그램/스크립트를 수정하는 것 (즉, 배열 배열 대신 객체 배열을 사용하는 것)을 제외하고는 할 수있는 일이 없습니다. 부가 메모 : 당신이 프로덕션에서 그러한 변수 이름을 사용하지 않기를 바랍니다. – dbemerlin

+0

dbemerlin : 5 개의 라이닝 된 함수에만 해당). 우리는 그것을 수정할 수 없습니다. 그것은 제 3 자로부터 왔고 그들은 이것을 생산에 넣었습니다. 그래서 나는 그것에 매달 렸습니다. –

+2

@dbemerlin : 아름답지는 않지만, 입력은 여전히 ​​유효한 JSON입니다. – Thanatos

답변

0

개체를 사용하면 전혀 문제가 없으므로 무시하십시오.

0

약간의 LINQ 같은 소리가 여기에 편리 할 것입니다. deserialised 객체 o이 주어지면 다음과 같은 것을 원할 것입니다. 그것은 아마도 더 적합 경우 new { ... } 구조가 anoynomous 유형의 객체를 생성하는

var result = o.Select(c => new 
         { 
          v1 = (int)c[0], 
          v2 = (int)c[1], 
          sz = (string)c[2], 
         }); 

주, 당신은 구조체를 사용할 수 있습니다.

여전히 실제 컨텍스트를 제공하지 않았기 때문에 최상의 해결책은 사실 아무 것도하지 않고 비 직렬화 된 결과를 약한 형식의 개체 배열로 남겨 둘 수 있습니다 ... 항상 값을 특정 형식으로 캐스팅 할 수 있습니다 나중에 명시 적으로 사용해야 할 때.

관련 문제