2015-01-14 50 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