2014-07-25 1 views
0

전체 오류를 역 직렬화 할 수 없습니다현재 JSON object..into 유형 'System.Collections.Generic.List`1 [선택 System.String]'

현재 JSON 객체 (예 : { "이름"을 역 직렬화 할 수 없습니다 : 타입이 JSON 배열 (예 : [1,2,3])을 필요로하기 때문에 을 deserialize하기 때문에 'System.Collections.Generic.List`1 [System.String]'유형으로 변환됩니다. 이 오류를 수정하려면 JSON 배열을 (예 : [1,2,3])으로 변경하거나 deserialized 유형을 일반 .NET 유형 (예 : 정수가 아닌 컬렉션과 같은 원시 유형이 아닌)으로 변경하십시오. 배열 또는 List와 같은 유형)은 JSON 객체에서 직렬화 될 수 있습니다. JsonObjectAttribute를 유형에 추가하여 이 JSON 객체에서 역 직렬화되도록 할 수도 있습니다. 잘 작동 하나 거기에 경로 'CEC1B0C9-A87A-4A9E-A017-AEFC3CEDCBD4', 2 호선, 코드의이 비트 전에 위치 (42)

, ...

var highlighting = JsonConvert.DeserializeObject<Object>(jsonDeserialized["highlighting"].ToString()); 

이 우리를 제공합니다 Google 검색 엔진의 일부 데이터 :

{\r\n "C6C1B0C9-A87A-4A9E-A017-AEFC3CEDCBD4": {\r\n "Title_fr": 
[\r\n  "<em>Chris</em> <em>Cep</em>"\r\n ]\r\n } ,\r\n 
"874BE5B1-FAA0-463F-98DD-8532D4D80178": {\r\n "Content_fr": [\r\n 
" <em>Chris</em> <em>Cep</em>, Ctifl \n\n9 Info - Tgif/
January - February 2001\n\nThe Tgif on the Net\nInquire"\r\n 
]\r\n } ,\r\n "44FA5B99-9472-499C-9827-646A511068DA": {\r\n 
"Content_fr": [\r\n  " S\n\nHorti\nThe 
database\ndocument\n<em>Chris</em> <em>Cep</em>, Iso 
Rever,\nJeane Samuel"\r\n ]\r\n } \r\n} 

//formatted - http://jsonblob.com/53d24a78e4b0ed12c5a6b1df 

{ 
    "C6C1B0C9-A87A-4A9E-A017-AEFC3CEDCBD4": { 
    "Title_fr": [ 
     "<em>Chris</em> <em>Cep</em>" 
    ] 
    }, 
    "874BE5B1-FAA0-463F-98DD-8532D4D80178": { 
    "Content_fr": [ 
     " <em>Chris</em> <em>Cep</em>, Ctifl \n\n9 Info - Tgif/ January - February 2001\n\nThe Tgif on the Net\nInquire" 
    ] 
    }, 
    "44FA5B99-9472-499C-9827-646A511068DA": { 
    "Content_fr": [ 
     " S\n\nHorti\nThe database\ndocument\n<em>Chris</em> <em>Cep</em>, Iso Rever,\nJeane Samuel" 
    ] 
    } 
} 

아래의 세 가지 개체는 모두 다르게 명명 된 것입니다. 나는. 나는 그 노드의 이름이 C6C1B0C9-A87A-4A9E-A017-AEFC3CEDCBD4 같은 GUID이기 때문에 JsonConvert.DeserializeObject<List<string>>(jsonDeserialized["highlighting"]["CAN'T-REFERENCE-ANYTHING-HERE"].ToString())을 할 수 없다.

저는 아직 JSON에서 친환경적입니다. 여기서 무엇을 놓치고 있습니까? 어떤 종류의 목록 <>에 "강조 표시"할 때 세 객체를 어떻게 얻을 수 있습니까?

내 솔루션 :

private class Highlighters //defined elsewhere 
    { 
     public string IdGlobal; 
     public string FieldName; 
     public string FieldValue; 
    } 

    var highlighters = new List<Highlighters>(); 
    var allHighlights = JsonConvert.DeserializeObject<IDictionary<string, object>>(jsonDeserialized["highlighting"].ToString()); 
    foreach (var entry in allHighlights) 
    { 
     string guid = entry.Key; 
     string j = entry.Value.ToString(); 
     var insideEntry = JsonConvert.DeserializeObject<IDictionary<string, object>>(j); 

     foreach (var h in insideEntry) 
     { 
      string highlightedField = h.Key; 
      string highlightedValue = h.Value.ToString().Substring(1, h.Value.ToString().LastIndexOf("]") - 1).Trim().Trim('"').Trim();//a little cleaning 

      highlighters.Add(new Highlighters{IdGlobal=guid, FieldName = highlightedField, FieldValue = highlightedValue}); 
     } 
    } 

답변

1

당신이 (당신의 예에서 GUID가 있습니다) 키에 관심이없는 경우는 Dictionary<string, JObject>에 JSON을 역 직렬화하고 결과 사전의 .Values에 액세스 할 수 있습니다.

+0

고마워요. 그게 제가 끝내었던 것입니다. (하지만 GUID도 필요합니다) - 위의 편집. –

관련 문제