【问题标题】:How to serialize array into querystring?如何将数组序列化为查询字符串?
【发布时间】:2017-12-13 18:06:08
【问题描述】:

我需要将包含数组的对象模型序列化为查询字符串,我有以下代码:

       public static string ToQueryString(this object query)
    {
        var result = new List<string>();
        var properties = query.GetType().GetProperties().Where(p => p.GetValue(query, null) != null && p.GetValue(query, null).ToString() != "0");

        foreach (var p in properties)
        {
            var value = p.GetValue(query, null);
            var collection = value as ICollection;
            if (collection != null)
            {
                result.AddRange(from object o in collection select string.Format("{0}={1}", p.Name, HttpUtility.UrlEncode(o.ToString())));
            }
            else
            {
                result.Add($"{p.Name}={HttpUtility.UrlEncode(value.ToString())}");
            }
        }

        return string.Join("&", result.ToArray());
    }

以及以下示例模型:

        var model = new exampleModel()
        {
            OrderBy = "name",
            OrderByDesc = true,
            PersonName= "John",
            Languages = new string[] { "French", "English", "Spanish" }
        };

当模型被序列化时,查询字符串的转换如下:

"OrderBy=name&OrderByDesc=true&PersonName=John&Languages=French&Languages=English&Languages=Spanish"

正如您所见,这是不可取的,因为对于集合中的每个值,查询字符串中都会重复属性“语言”。有谁知道我怎样才能获得查询字符串,例如:

"OrderBy=name&OrderByDesc=true&PersonName=John&Languages=法语、英语、西班牙语"

【问题讨论】:

  • 注意:如果你想尽量减少水平滚动的需要,你可以通过选择代码的相关部分,然后点击编辑器顶部的[{ }]按钮来减少缩进。

标签: c# serialization query-string


【解决方案1】:

将您对ICollection 的处理方式更改为您希望的格式:

  public static string ToQueryString(this object query)
{
    var result = new List<string>();
    var properties = query.GetType().GetProperties().Where(p => p.GetValue(query, null) != null && p.GetValue(query, null).ToString() != "0");

    foreach (var p in properties)
    {
        var value = p.GetValue(query, null);
        var collection = value as ICollection;
        if (collection != null)
        {
            result.Add(p.Name+"="+string.Join(",", collection.Select(o => HttpUtility.UrlEncode(o.ToString())).ToArray());
        }
        else
        {
            result.Add($"{p.Name}={HttpUtility.UrlEncode(value.ToString())}");
        }
    }

    return string.Join("&", result.ToArray());
}

【讨论】:

    【解决方案2】:

    检查属性值是否为数组,由于数组实现了IEnumerable,您可以像这样创建一个通用函数:

    public string ConvertToQueryString(object obj)
    {
        var properties = from p in obj.GetType().GetProperties()
                     where p.GetValue(obj, null) != null
                     select p.Name + "=" + (
                         p.GetValue(obj, null).GetType().IsArray ?
                         string.Join(",", ((IEnumerable)p.GetValue(obj, null)).Cast<object>().Select(x => x.ToString()).ToArray()) :
                         p.GetValue(obj, null).ToString() 
                         );
    
        return string.Join("&", properties.ToArray());
    }
    

    【讨论】:

      猜你喜欢
      • 2011-02-07
      • 1970-01-01
      • 2014-02-05
      • 2011-10-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多