【问题标题】:Serializing KeyValuePair<TKey, TValue> type property to JSON in C#在 C# 中将 KeyValuePair<TKey, TValue> 类型属性序列化为 JSON
【发布时间】:2017-01-17 20:58:57
【问题描述】:

我正在尝试在 C# 中序列化一个 KeyValuePair 属性,如下所示:

[JsonDisplayName("custom")]
public  KeyValuePair<string,string> Custom { get; set; }

通过将属性设置为 JSON:

MyClass.Custom = new KeyValuePair<string, string>("destination", destination);

但我得到的输出看起来像这样:

"custom":{"Key":"destination","Value":"Paris"}

我想要的是:

"custom":{"destination":"Paris"}

有什么想法吗?我正在使用 Compact Framework 和 Visual Studio 2008,所以我不想使用任何外部库。非常感谢您的帮助。

更新: 我必须使用我公司的 Model 类,它有一个 SetCustom 方法,如果我使用字典会引发异常。

【问题讨论】:

标签: c# json serialization


【解决方案1】:

你可以用字典代替键值对

public class A
{
    [JsonProperty("custom")]
    public Dictionary<string, string> Custom
    {
        get;
        set;
    }
}
public class Program
{
    public static void Main()
    {
        A custom = new A();
        custom.Custom = new Dictionary<string, string>(){
            {"destination1", "foo"},
            {"destination2", "bar"},
        };
        Console.WriteLine(JsonConvert.SerializeObject(custom));
    }
}

这会产生

{"custom":{"destination1":"foo","destination2":"bar"}}

或者如果你想坚持使用KeyValuePair,你需要创建自己的转换器

public class A
{
    [JsonProperty("custom")]
    public KeyValuePair<string, string> Custom
    {
        get;
        set;
    }
}

class KeyValueStringPairConverter : JsonConverter
{
    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        KeyValuePair<string, string> item = (KeyValuePair<string, string>)value;
        writer.WriteStartObject();
        writer.WritePropertyName(item.Key);
        writer.WriteValue(item.Value);
        writer.WriteEndObject();
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        throw new NotImplementedException();
    }

    public override bool CanConvert(Type objectType)
    {
        return objectType == typeof (KeyValuePair<string, string>);
    }
}

public class Program
{
    public static void Main()
    {
        A custom = new A();
        JsonSerializerSettings settings = new JsonSerializerSettings{Converters = new[]{new KeyValueStringPairConverter()}};
        custom.Custom = new KeyValuePair<string, string>("destination", "foo");
        Console.WriteLine(JsonConvert.SerializeObject(custom, settings));
    }
}

【讨论】:

    【解决方案2】:

    不要忘记从 NuGet Newtonsoft.Json 下载

    class Program
    {
        static void Main(string[] args)
        {
            String [,] arr = new String[1,2];
            arr[0,0] = "Hello";
            arr[0,1] = "World";
    
            Console.WriteLine(JsonConvert.SerializeObject(arr));
            Console.ReadKey(true);
            //[["Hello","World"]]
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-02-19
      • 2011-01-16
      • 1970-01-01
      • 1970-01-01
      • 2011-11-21
      • 1970-01-01
      • 2013-08-12
      • 2012-07-25
      相关资源
      最近更新 更多