C# 在序列化之前将字符串[]转换为字符串
这是我代码的一部分:C# 在序列化之前将字符串[]转换为字符串,c#,json,serialization,json.net,C#,Json,Serialization,Json.net,这是我代码的一部分: Dictionary<string, string[]> dict = new Dictionary<string, string[]>(); 如果字符串数组中只有1项,我想将字符串[]转换为字符串 因此,如果输出为: { "Number": ["123"], "Names": ["John", "Harry"] } 我希望它是: { "Number": "123", "Names": ["John", "Harry"] } 因为在“123”的
Dictionary<string, string[]> dict = new Dictionary<string, string[]>();
如果字符串数组中只有1项,我想将字符串[]转换为字符串
因此,如果输出为:
{
"Number": ["123"],
"Names": ["John", "Harry"]
}
我希望它是:
{
"Number": "123",
"Names": ["John", "Harry"]
}
因为在“123”的数组中只有1项。那么,如何解决这个问题呢?一种方法是:
var newDict = dict.ToDictionary(x => x.Key,
x => x.Value.Length == 1 ? (object)x.Value.Single() : (object)x.Value);
然后序列化newDict
大部分逻辑都在第二个论点中。我根据长度决定是使用KVP值部分的单个元素还是整个字符串数组。您可以实现自己的
JsonConverter
,如下所示
好像你不想每次都重新创建一个字典
public class SingleElementArrayJsonConverter : JsonConverter
{
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
string[] arr = value as string[];
if (arr == null)
{
throw new ArgumentNullException(nameof(value));
}
if(arr.Length == 1)
{
JToken.FromObject(arr[0]).WriteTo(writer);
}
else
{
JArray.FromObject(arr).WriteTo(writer);
}
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
throw new NotImplementedException();
}
public override bool CanWrite => true;
public override bool CanRead => false;
public override bool CanConvert(Type objectType) => objectType == typeof(string[]);
}
此转换器应按如下方式使用:
string serialized = JsonConvert.SerializeObject(dict, new SingleElementArrayJsonConverter());
你想这样做有什么特别的原因吗?如果可以有多个项,但在某些情况下只有一个项,则它应保持为字符串[]。在某些情况下,它只是一个项目的数组。通过这种方式,其他解析器将能够更好地解释您的JSON。不知道您的用例是什么,但我强烈建议不要这样做,因为这可能会给试图阅读您的JSON的人带来很多麻烦。如果它总是只包含一个值,为什么不立即将其更改为string呢?或者为序列化创建一个itermediate类。这使得序列化和反序列化对于您和第三方来说都变得不必要的复杂。但是,您可以创建名称
属性和名称
属性,其中前者仅在只有一个名称时填充,后者仅在有多个名称时填充,另一个始终设置为null。
string serialized = JsonConvert.SerializeObject(dict, new SingleElementArrayJsonConverter());