如何使用JavaScriptSerializer将JSON反序列化为元组

本文关键字:反序列化 元组 JSON 何使用 JavaScriptSerializer | 更新日期: 2023-09-27 18:19:32

我正在寻找将JSON字符串反序列化为c#List<Tuple<string, string>>的方法。

    "[{'"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]

在列表元组中。。。

任何帮助都将是美妙的。谢谢

如何使用JavaScriptSerializer将JSON反序列化为元组

这应该可以工作。请注意,您需要通过首先添加括号[]将输入转换为有效的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();

更多信息请参阅文档。

假设您获得了一个有效的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

如果您为Tuple创建了JSON可以解释的数据协定,则可以使用DataContractJsonSerializer(来自System.Runtime.Serialization.JSON库):

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.
}