2015-01-14 21 views
-4

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

问题是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

'这个具体的例子或链接'的任何帮助,会很好,如果我们知道你的问题.. – EZI

+0

你到目前为止尝试过什么,不起作用?你作为错误或意外输出得到什么?如果我们不完全了解您的问题,我们将无法帮助您:) –

+0

那么您的_actual_问题是什么?你的代码有错误吗?意外的结果? –

回答

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回到客户端的数据。这是前提,但没有更多的澄清,我们不确定你想要什么。

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