【问题标题】:Get Tuple from string returned by Tuple.ToString()从 Tuple.ToString() 返回的字符串中获取元组
【发布时间】:2017-10-20 08:19:17
【问题描述】:

说,我们有那个代码:

var tuple = new Tuple<double, int>(10.6, 2);
var tupleString = tuple.ToString(); //returns "(10.6, 2)";

我们能否在不实现任何自定义解析器和 JsonConverters 以及扩展 TypeConverter 的情况下从 tupleString 获取新的 Tuple 实例?

更新 1
在我的生产代码中,我有SortedList&lt;Tuple&lt;DayOfWeek, double&gt;, double&gt;。该列表由 Json.NET 序列化,通过.ToString() 转换字典键。然后 JSON 被发送到前端应用程序。然后前端应用程序使用该序列化密钥向服务器发送请求。我必须将该密钥转换为 .NET Tuple,但我不知道该怎么做。

【问题讨论】:

  • 您是否假设只有 double, int 的元组需要从字符串中重建?在general 中,不能保证通过在各个元组组件上调用ToString() 创建的字符串包含足够的信息来重新创建原始数据类型。如果你想要序列化,你应该寻找序列化机制,而不是ToString
  • @Damien_The_Unbeliever,我更新了我的问题。

标签: c# .net


【解决方案1】:

当然可以。您可以“简单地”解析输出字符串,但我希望您喜欢编写解析算法,这可能会变得很难,尤其是当它涉及字符串和对象时......

例如看这个,这是无法解析的:

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

【讨论】:

  • 我的感受完全一致。这是可能的,但不值得花时间和精力。
【解决方案2】:

我使用 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,Json.NET 将通过 JsonConvert.SerializeObject() 而不是 .ToString() 序列化其密钥。这样 Tuple 就可以被 Json.NET 正确反序列化了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多