.NET JsonConverter元组列表

时间:2015-01-14 21:29:50

标签: c# .net json.net

我试图在冻结期间使用自定义JsonConverter将List<Tuple<string,string>>转换为List<Tuple<string, JRaw>>。因此,如果我在该列表上预先形成List<Tuple<string, string>>时有JsonConvert.SerializeObject,我希望它将该列表序列化,就好像它是List<Tuple<string,JRaw>>类型一样。原因是元组的Item2字段已经格式化为Json,所以我想将它包装在一个JRaw值中,这样它就不会在序列化过程中被读作字符串。

问题是关于JsonConverters的文档有点稀疏。我一直在查看堆栈溢出和谷歌上的类似问题,但似乎无法找到关于如何创建JsonConverters的好教程。任何有关此特定示例的帮助或指向良好教程的链接都会很棒。

对于那些好奇的人来说,这是我的第一次尝试:

```

public class DataJsonConverter : JsonConverter
{
    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        List<Tuple<string, JRaw>> jlist = ((List<Tuple<string, string>>)value).Select(t => new Tuple<string, JRaw>(t.Item1, new JRaw(t.Item2))).ToList();
        new JArray(jlist).WriteTo(writer);

    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        return JsonConvert.DeserializeObject<List<Tuple<string, string>>>(reader.ReadAsString());
    }

    public override bool CanConvert(Type objectType)
    {
        throw new NotImplementedException();
    }
}

```

这应该清除我在编写JsonConverters时知道我在做什么的任何误解。旁注,我也是C#的新手,是一种来自Java的语言。

2 个答案:

答案 0 :(得分:0)

您能否展示您的代码,而不会对您的问题和方法毫无头绪。

另外,你能否澄清一下List<Tuple<string, string>>,因为这很可能并不可行。你为什么需要Tuple?是的,它会存储一个有序列表,如果你构建一个存储所有值的object,理论上这将是多余的。

这段代码可以实现:

客户端:

function BuildOrder(Product, Quantity, Price) {
     var item = null;
     item = {
          Product: Product,
          Quantity: Quantity,
          Price: Price
     };
}

这将构建我们的object,我们将在下面的示例中对其进行反序列化。

order.push(BuildOrder(product, quantity, price)); // Fill our Array
var convert = JSON.stringfy(order); 

$.ajax({
     url: 'location to your page',
     data: { Order: convert },
     type: 'POST',

     success: function (order) {
          // Returned object, how should it apply to your page.
     }
});

然后在服务器端代码中,您将拥有一个模型:

public class Order
{
     public string Product { get; set; }
     public string Quantity { get; set; }
     public string Price { get; set; }
}

现在正在解析的页面上,您只需:

JavaScriptSerializer serializer = new JavaScriptSerializer();
List<Order> deserialize = serializer.Deserialize<List<Order>>(order);
foreach(var content in deserialize)
{
     // Iterate through your client data sent to the server.
}

...之后,您将object发送回客户端以获取数据。这是前提,但如果没有更多的澄清,我们无法确定你想要什么。

答案 1 :(得分:0)

即使我的问题中存在一些敏捷问题,并且我的设计选择中存在一些问题,以防有人发现他们遇到类似的问题,我会发布JsonConverter,我最终使用了:

```

public class DataJsonConverter : JsonConverter
{
    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        List<Tuple<string, JRaw>> jlist = ((List<Tuple<string, string>>)value).Select(t => new Tuple<string, JRaw>(t.Item1, new JRaw(t.Item2))).ToList();
        serializer.Serialize(writer, jlist);
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        JArray jarray = JArray.Load(reader);

        List<Tuple<string, string>> result = new List<Tuple<string, string>>();
        string item1;
        string item2;
        foreach (JObject j in jarray)
        {
            item1 = j.GetValue("Item1").ToString();
            item2 = j.GetValue("Item2").ToString();
            result.Add(new Tuple<string, string>(item1, item2));
        }
        return result;
    }

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

```

NewtonSoft已经知道如何编写List<Tuple<string, JRaw>>作为Json我只需要序列化它。

我还发现访问此Json .Net Blog post以及此post会很有帮助。