将List <KeyValuePair >序列化为JSON

我是JSON的新手,请帮忙!

我试图将List<KeyValuePair>序列化为JSON

目前:

 [{"Key":"MyKey 1","Value":"MyValue 1"},{"Key":"MyKey 2","Value":"MyValue 2"}] 

预期:

 [{"MyKey 1":"MyValue 1"},{"MyKey 2":"MyValue 2"}] 

我提到了这个和这个的一些例子。

这是我的KeyValuePairJsonConverter:JsonConverter

 public class KeyValuePairJsonConverter : JsonConverter { public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) { List<KeyValuePair> list = value as List<KeyValuePair>; writer.WriteStartArray(); foreach (var item in list) { writer.WriteStartObject(); writer.WritePropertyName(item.Key.ToString()); writer.WriteValue(item.Value.ToString()); writer.WriteEndObject(); } writer.WriteEndArray(); } public override bool CanConvert(Type objectType) { return objectType == typeof(List<KeyValuePair>); } public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { var jsonObject = JObject.Load(reader); var target = Create(objectType, jsonObject); serializer.Populate(jsonObject.CreateReader(), target); return target; } private object Create(Type objectType, JObject jsonObject) { if (FieldExists("Key", jsonObject)) { return jsonObject["Key"].ToString(); } if (FieldExists("Value", jsonObject)) { return jsonObject["Value"].ToString(); } return null; } private bool FieldExists(string fieldName, JObject jsonObject) { return jsonObject[fieldName] != null; } } 

我是从这样的WebService方法调用它

 List<KeyValuePair> valuesList = new List<KeyValuePair>(); Dictionary valuesDict = SomeDictionaryMethod(); foreach(KeyValuePair keyValue in valuesDict) { valuesList.Add(keyValue); } JsonSerializerSettings jsonSettings = new JsonSerializerSettings { Converters = new [] {new KeyValuePairJsonConverter()} }; string valuesJson = JsonConvert.SerializeObject(valuesList, jsonSettings); 

您可以使用Newtonsoft和字典:

  var dict = new Dictionary(); dict.Add(1, "one"); dict.Add(2, "two"); var output = Newtonsoft.Json.JsonConvert.SerializeObject(dict); 

输出是:

 {"1":"one","2":"two"} 

编辑

感谢@Sergey Berezovskiy提供的信息。

您当前正在使用Newtonsoft,因此只需将List>更改为Dictionary并使用包中的serialize和deserialize方法。

所以我不想使用除了本地c#之外的任何东西来解决类似的问题,并且参考这是使用.net 4,jquery 3.2.1和骨干1.2.0。

我的问题是List>会从控制器进入骨干模型,但是当我保存该模型时,控制器无法绑定List。

 public class SomeModel { List> SomeList { get; set; } } [HttpGet] SomeControllerMethod() { SomeModel someModel = new SomeModel(); someModel.SomeList = GetListSortedAlphabetically(); return this.Json(someModel, JsonBehavior.AllowGet); } 

网络捕获:

 "SomeList":[{"Key":13,"Value":"aaab"},{"Key":248,"Value":"aaac"}] 

但即使这在后台模型中正确设置SomeList.js尝试保存模型而不对其进行任何更改,也会导致绑定SomeModel对象与请求主体中的参数具有相同的长度,但所有键和值都为null:

 [HttpPut] SomeControllerMethod([FromBody] SomeModel){ SomeModel.SomeList; // Count = 2, all keys and values null. } 

我能找到的唯一的事情是KeyValuePair是一个结构,而不是可以这种方式实例化的东西。 我最终做的是以下内容:

  • 在包含键,值字段的某处添加Model包装器:

     public class KeyValuePairWrapper { public int Key { get; set; } public String Value { get; set; } //default constructor will be required for binding, the Web.MVC binder will invoke this and set the Key and Value accordingly. public KeyValuePairWrapper() { } //a convenience method which allows you to set the values while sorting public KeyValuePairWrapper(int key, String value) { Key = key; Value = value; } } 
  • 设置绑定类模型以接受自定义包装器对象。

     public class SomeModel { public List KeyValuePairList{ get; set }; } 
  • 从控制器中获取一些json数据

     [HttpGet] SomeControllerMethod() { SomeModel someModel = new SomeModel(); someModel.KeyValuePairList = GetListSortedAlphabetically(); return this.Json(someModel, JsonBehavior.AllowGet); } 
  • 稍后做一些事情,可能会调用model.save(null,…)

     [HttpPut] SomeControllerMethod([FromBody] SomeModel){ SomeModel.KeyValuePairList ; // Count = 2, all keys and values are correct. }