2014-08-27 4 views
0

JSON 문자열을 C# List<Tuple<string, string>>으로 비 직렬화하는 방법을 찾고 있습니다.JavaScriptSerializer를 사용하여 JSON을 비 병렬화하는 방법

"[{\"name\":\"OkeyTablePaired\",\"value\":\"true\"},  
     {\"name\":\"OkeyTableIndicator\",\"value\":\"true\"},  
     {\"name\":\"OkeyTableHued\",\"value\":\"true\"},  
     {\"name\":\"OkeyTableSpectatorQuiet\",\"value\":\"true\"},  
     {\"name\":\"OkeyTableEveryoneQuiet\",\"value\":\"true\"}]" 

튜플 목록 :

내가

목록 튜플에서
[OkeyTablePaired]:[true] 
[OkeyTableIndicator]:[false] 
[OkeyTableHued]:[true] 
[OkeyTableSpectatorQuiet]:[true] 
[OkeyTableEveryoneQuiet]:[true] 

으로 함께 넣어 싶습니다

List<Tuple<string, string>> tupleJson = new List<Tuple<string, string>>(); 

...

어떤 도움이 환상적 일 것입니다. 감사합니다. .

+0

당신이 System.Web.Helpers.Json.Decode 를 사용하려고 했습니까? http://msdn.microsoft.com/pl-pl/library/system.web.helpers.json.decode(v=vs.111).aspx – Mario

+3

유효한 JSON 문자열이 아닙니다. 아마도 주위에 배열 대괄호 ('[]')가 있습니까? –

+0

샘플 json 코드에 예상 태그를 추가했습니다. 나는 쓰는 것을 잊었다. 덕분에 –

답변

4

이렇게하면됩니다. 먼저 대괄호 []를 추가하여 입력을 유효한 json 배열로 변환해야합니다. 이 작업을하려면 JSON.NET을 얻어야합니다.

 //using System; 
     //using System.Collections.Generic; 
     //using System.Linq; 
     //using Newtonsoft.Json.Linq; 

     string validJson = "[" + json + "]"; 
     JArray jsonArray = JArray.Parse(validJson); 
     List<Tuple<string, string>> tupleJson = jsonArray 
      .Select(p => new Tuple<string, string>((string)p["name"], (string)p["value"])) 
      .ToList(); 

자세한 내용은 documentation. 당신은 JSON이 해석 할 수있는 튜플에 대한 데이터 계약을 만든 경우

+0

덕분에 많이 사용하겠습니다. 그것은 매우 간단하고 정말로 코드입니다! 덕분에 +1 +1 –

1

있습니다 (System.Runtime.Serialization.Json 라이브러리에서) DataContractJsonSerializer를 사용할 수 있습니다

var request = WebRequest.Create(requestUrl) as HttpWebRequest; 
request.Method = "GET"; 
var jsonSerializer = new DataContractJsonSerializer(typeof (Tuple)); 
var objResponse = (Tuple) jsonSerializer.ReadObject(response.GetResponseStream()); 

데이터 계약을, 당신의 사건은 아마 매우 간단 것, 이런 일이 :

[DataContract] 
public class Tuple 
{ 
    [DataMember] 
    public string OkeyTablePaired {get; set;} 
    [DataMember] 
    public string OkeyTableIndicator {get; set;} 
    .....etc. 
} 
+0

고마워, +1 –

2

유효한 JSON 배열을 얻을 가정, JSON.NET와 사용자 지정 컨버터는 잘 작동 :

012 3,

사용법 :

List<Tuple<string, string>> result = 
    JsonConvert.DeserializeObject<List<Tuple<string, string>>>(json, new TupleConverter()); 

예 :https://dotnetfiddle.net/TEbNsH

+1

+1,하지만 몇 가지 제안 사항이 개선되었습니다. 질문에 JSON 조각이 더 큰 JSON의 일부가 될 경우에만 키 - 값 쌍 이상의 목록을 포함 이 변환기는'CanConvert'가 항상 true를 반환한다는 사실 때문에 모든 것을 변환하려고 시도 할 것입니다. CanConvert가'objectType == List >'일 때만 true를 반환하면 더 좋을 것입니다. 또한'WriteJson'이 구현되지 않았다면'CanWrite'를 구현하여 false를 반환해야합니다. 'CanRead'는 기본 JsonConverter에서 기본적으로 true를 반환하므로, 재정의 할 필요가 없습니다. –

+0

제안 해 주셔서 감사 드리며 몇 가지 사항을 변경하겠습니다. –

+0

매력처럼 작동합니다. +1 –