2014-08-27 81 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

相关问题