我试图在冻结期间使用自定义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的语言。
答案 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会很有帮助。