2014-08-27 80 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\"}]" 

元組列表:

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

我想將它們放在一起作爲

[OkeyTablePaired]:[true] 
[OkeyTableIndicator]:[false] 
[OkeyTableHued]:[true] 
[OkeyTableSpectatorQuiet]:[true] 
[OkeyTableEveryoneQuiet]:[true] 
在列表元組

...

任何幫助將是非常美妙的。 謝謝。

+0

你嘗試使用System.Web.Helpers.Json.Decode ? http://msdn.microsoft.com/pl-pl/library/system.web.helpers.json.decode(v=vs.111).aspx – Mario 2014-08-27 13:22:16

+3

這不是一個有效的JSON字符串。它周圍是否有數組括號('[]')? – 2014-08-27 13:28:55

+0

我添加了預期的標籤來採樣json代碼。我忘了寫。謝謝 – 2014-08-27 15:23:34

回答

4

這應該工作。請注意,您需要首先通過添加括號[]將輸入轉換爲有效的json數組。您需要獲得JSON.NET才能完成此項工作。在documentation

 //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(); 

更多信息。

+0

非常感謝,我會用這個。這是非常簡單,真正的和絃代碼!由於增益+1 – 2014-08-27 15:20:51

1

如果您已經創建了一個數據合同元組的JSON可以解釋,你可以使用DataContractJsonSerializer(從System.Runtime.Serialization.Json庫):

​​

的數據合同,你的情況下,很可能是非常簡單的,像這樣:

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

非常感謝,+1 +1 – 2014-08-27 15:20:15

2

假設你得到一個有效的JSON數組,JSON.NET一個自定義的轉換器會工作,以及:

public class TupleConverter : JsonConverter 
{ 
    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) 
    { 
     throw new NotImplementedException(); 
    } 

    public override bool CanWrite 
    { 
     get { return false; } 
    } 

    public override bool CanConvert(Type objectType) 
    { 
     return objectType == typeof(List<Tuple<string, string>>); 
    } 

    public override object ReadJson(
     JsonReader reader, 
     Type objectType, 
     object existingValue, 
     JsonSerializer serializer) 
    { 
     List<Tuple<string, string>> result = null; 

     if (reader.TokenType == JsonToken.StartArray) 
     {    
      JArray deserialized = JArray.Load(reader); 
      result = new List<Tuple<string, string>>(deserialized.Count); 

      foreach (var token in deserialized) 
      { 
       if (token.Type == JTokenType.Object) 
       { 
        result.Add(Tuple.Create(
         token["name"].ToObject<string>(), 
         token["value"].ToObject<string>())); 
       } 
      } 
     } 

     return result; 
    } 
} 

用法:

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

例子:https://dotnetfiddle.net/TEbNsH

+1

,但我有幾個改進建議:如果在問題的JSON片段恰好是含有不僅僅是鍵 - 值對列表的詳細較大JSON的一部分,由於'CanConvert'總是返回true,所以這個轉換器會嘗試轉換所有內容並失敗。如果CanConvert只在'objectType == List >'時返回true,會更好。另外,如果'WriteJson'沒有實現,你應該實現'CanWrite'來返回false。在基本的JsonConverter中'CanRead'默認返回true,所以你不需要重寫那個。 – 2014-08-27 14:49:34

+0

感謝您的建議,我會做出一些更改。 – 2014-08-27 14:52:30

+0

像魅力一樣工作,非常感謝; +1 – 2014-08-27 15:19:36

相關問題