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());