将类数组成员序列化为展平

时间:2013-05-24 17:24:54

标签: c# serialization json.net

Json.Net是否可以转换以下片段以使其数组成员变平?

{
  "format": "json",
  "artist": "artist1",
  "description": [
    "description1",
    "description2"
  ]
}

像这样:

{
  "format": "json",
  "artist": "artist1",
  "description": "description1",
  "description": "description2",
}

简而言之,对象看起来像字典,但允许重复键。

尝试使用自定义JsonConverter,如下所示:

internal class MyConverter : JsonConverter
{
    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        var strings = (string[])value;
        foreach (var s in strings)
        {
            writer.WritePropertyName(writer.Path);
            writer.WriteValue(s);
        }
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        throw new NotImplementedException();
    }

    public override bool CanConvert(Type objectType)
    {
        return objectType == typeof(string[]);
    }
}

但是在编写属性的名称时会引发JsonWriterException:

状态属性中的

Token PropertyName将导致无效的JSON对象。路径'。

创建这样的无效对象很好,因为我以后没有计划对它进行反序列化,实际上我需要以下列形式创建url参数字符串:

格式= JSON&安培;艺术家= artist1&安培;描述=描述1&安培;描述=内容描述

是否值得尝试使用Json.Net基础设施来实现这一目标?

1 个答案:

答案 0 :(得分:0)

这是我对问题的解决方案:JsonTextReader

private static string GetUrlParameters(string json)
{
    JsonTextReader reader = new JsonTextReader(new StringReader(json));
    string path = null;
    List<string> list = new List<string>();
    while (reader.Read())
    {
        JsonToken tokenType = reader.TokenType;
        switch (tokenType)
        {
            case JsonToken.PropertyName:
                path = reader.Path;
                break;
            case JsonToken.Integer:
            case JsonToken.Float:
            case JsonToken.String:
            case JsonToken.Boolean:
                string item = string.Format("{0}={1}", path, reader.Value);
                list.Add(item);
                break;
        }
    }
    return string.Join("&", list);
}