C# 将类数组成员序列化为展平
使用Json.Net是否可以将以下片段转换为其数组成员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
{
"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);
}