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基础设施来实现这一目标?
答案 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);
}