Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将类数组成员序列化为展平_C#_Serialization_Json.net - Fatal编程技术网

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

C# 将类数组成员序列化为展平,c#,serialization,json.net,C#,Serialization,Json.net,使用Json.Net是否可以将以下片段转换为其数组成员 { "format": "json", "artist": "artist1", "description": [ "description1", "description2" ] } 像这样: { "format": "json", "artist": "artist1", "description": "description1", "description": "description

使用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[]);
    }
}
但写入属性名称时会引发JsonWriteException:

状态属性中的令牌PropertyName将导致无效的JSON对象。路径“”

创建这样的无效对象是可以的,因为我以后没有反序列化它的计划,实际上我需要它来创建url参数字符串,格式如下:

format=json&artist=artist1&description=description1&description=description2


尝试使用Json.Net基础设施来实现这一点值得吗?

以下是我的解决方案: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);
}
私有静态字符串GetUrlParameters(字符串json)
{
JsonTextReader=newjsontextreader(newstringreader(json));
字符串路径=null;
列表=新列表();
while(reader.Read())
{
JsonToken tokenType=reader.tokenType;
交换机(令牌类型)
{
案例JsonToken.PropertyName:
path=reader.path;
打破
案例JsonToken.Integer:
case JsonToken.Float:
case JsonToken.String:
案例JsonToken.Boolean:
string item=string.Format(“{0}={1}”,路径,reader.Value);
列表。添加(项目);
打破
}
}
返回字符串。Join(“&”,list);
}