说,我们有那个代码:
var tuple = new Tuple<double, int>(10.6, 2);
var tupleString = tuple.ToString(); //returns "(10.6, 2)";
我们可以从tupleString
获取一个新的Tuple实例而无需实现任何自定义解析器和JsonConverters并扩展TypeConverter吗?
更新1
在我的生产代码中,我有SortedList<Tuple<DayOfWeek, double>, double>
。该列表由Json.NET序列化,它将字典键转换为.ToString()
。然后将JSON发送到前端应用程序。然后前端应用程序使用该序列化密钥向服务器发送请求。我必须将该密钥转换为.NET Tuple,但我不知道该怎么做。
答案 0 :(得分:4)
当然可以。你可以“简单地”解析输出字符串,但我希望你喜欢编写解析算法然后可能会变得很难,特别是当它涉及字符串和对象时...
例如参见这个,这是不可能解析的:
var tuple = new Tuple<string, int>("10, 6", 2);
var tupleString = tuple.ToString(); //returns "(10, 6, 2)";
我建议先使用元组本身中的项目,而不是先从字符串中删除字符串:
Tuple<int> tuple2 = tuple.Item2;
如果使用JSON.NET对其进行序列化,则应编写或使用自定义序列化程序,如the one mentioned here。
答案 1 :(得分:0)
我使用Nate Barbettini的this回答以另一种方式解决了我的问题。 我把他的代码更改为:
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
Type type = value.GetType();
IEnumerable keys = (IEnumerable)type.GetProperty("Keys").GetValue(value, null);
IEnumerable values = (IEnumerable)type.GetProperty("Values").GetValue(value, null);
IEnumerator valueEnumerator = values.GetEnumerator();
writer.WriteStartObject();
foreach (object key in keys)
{
valueEnumerator.MoveNext();
writer.WritePropertyName(JsonConvert.SerializeObject(key));
serializer.Serialize(writer, valueEnumerator.Current);
}
writer.WriteEndObject();
}
然后将自定义JsonConverterAttribute设置为必需的IDictionary&lt;,&gt;并且Json.NET将按JsonConvert.SerializeObject()
而不是.ToString()
序列化其密钥。因此,Json.NET可以正确地反序列化Tuple。