JSON сериализация в Key-Value - C#

Узнай цену своей работы

Формулировка задачи:

Здравствуйте. Есть слудующий json:
Листинг программы
  1. {
  2. "rates_scores_stats": [{
  3. "name": 10,
  4. "value": 3545
  5. }, {
  6. "name": 9,
  7. "value": 1004
  8. }, {
  9. "name": 8,
  10. "value": 820
  11. }, {
  12. "name": 7,
  13. "value": 493
  14. }, {
  15. "name": 6,
  16. "value": 218
  17. }, {
  18. "name": 5,
  19. "value": 138
  20. }, {
  21. "name": 4,
  22. "value": 80
  23. }, {
  24. "name": 3,
  25. "value": 41
  26. }, {
  27. "name": 2,
  28. "value": 26
  29. }, {
  30. "name": 1,
  31. "value": 83
  32. }
  33. ],
  34. "rates_statuses_stats": [{
  35. "name": "Запланировано",
  36. "value": 2506
  37. }, {
  38. "name": "Смотрю",
  39. "value": 7861
  40. }, {
  41. "name": "Просмотрено",
  42. "value": 1947
  43. }, {
  44. "name": "Отложено",
  45. "value": 1443
  46. }, {
  47. "name": "Брошено",
  48. "value": 1358
  49. }
  50. ]
  51. }
Я знаю, что его можно сериализовать классом следующего типа:
Листинг программы
  1. public class RatesScoresStat
  2. {
  3. public int name { get; set; }
  4. public int value { get; set; }
  5. }
  6. public class RatesStatusesStat
  7. {
  8. public string name { get; set; }
  9. public int value { get; set; }
  10. }
  11. public class RootObject
  12. {
  13. public List<RatesScoresStat> rates_scores_stats { get; set; }
  14. public List<RatesStatusesStat> rates_statuses_stats { get; set; }
  15. }
Но там ведь по сути возвращается ключ-значение. Не хотелось бы городить лишние вспомогательны классы из-за этого. Не подскажите, как лучше подобное сериализовать, чтобы получилось что-то вроде следующего?
Листинг программы
  1. public class RootObject
  2. {
  3. public Dictionary<int, int> rates_scores_stats { get; set; }
  4. public Dictionary<string, int> rates_statuses_stats { get; set; }
  5. }
Конкретно этот пример выдаёт ошибку десериализации =/
Листинг программы
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. using Newtonsoft.Json;
  7. using System.IO;
  8. using System.Net;
  9. namespace ShikiTestApp
  10. {
  11. class Program
  12. {
  13. static void Main(string[] args)
  14. {
  15. string json = "{'rates_scores_stats':[{'name':10,'value':3545},{'name':9,'value':1004},{'name':8,'value':820},{'name':7,'value':493},{'name':6,'value':218},{'name':5,'value':138},{'name':4,'value':80},{'name':3,'value':41},{'name':2,'value':26},{'name':1,'value':83}],'rates_statuses_stats':[{'name':'Запланировано','value':2506},{'name':'Смотрю','value':7861},{'name':'Просмотрено','value':1947},{'name':'Отложено','value':1443},{'name':'Брошено','value':1358}]}";
  16. var result = JsonConvert.DeserializeObject<TestClass>(json);
  17. Console.WriteLine(result.rates_scores_stats[9]);
  18. }
  19. }
  20. public class TestClass
  21. {
  22. public Dictionary<int, int> rates_scores_stats { get; set; }
  23. public Dictionary<string, int> rates_statuses_stats { get; set; }
  24. }
  25. }
Newtonsoft.Json.JsonSerializationException не обработано HResult=-2146233088 Message=Cannot deserialize the current JSON array (e.g. [1,2,3]) into type 'System.Collections.Generic.Dictionary`2[System.Int32,System.Int32]' because the type requires a JSON object (e.g. {"name":"value"}) to deserialize correctly. To fix this error either change the JSON to a JSON object (e.g. {"name":"value"}) or change the deserialized type to an array or a type that implements a collection interface (e.g. ICollection, IList) like List<T> that can be deserialized from a JSON array. JsonArrayAttribute can also be added to the type to force it to deserialize from a JSON array. Path 'rates_scores_stats', line 1, position 23. Source=Newtonsoft.Json StackTrace: в Newtonsoft.Json.Serialization.JsonSerializerInternalReader.EnsureArrayContract(JsonReader reader, Type objectType, JsonContract contract) в Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateList(JsonReader reader, Type objectType, JsonContract contract, JsonProperty member, Object existingValue, String id) в Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateValueInternal(JsonReader reader, Type objectType, JsonContract contract, JsonProperty member, JsonContainerContract containerContract, JsonProperty containerMember, Object existingValue) в Newtonsoft.Json.Serialization.JsonSerializerInternalReader.SetPropertyValue(JsonProperty property, JsonConverter propertyConverter, JsonContainerContract containerContract, JsonProperty containerProperty, JsonReader reader, Object target) в Newtonsoft.Json.Serialization.JsonSerializerInternalReader.PopulateObject(Object newObject, JsonReader reader, JsonObjectContract contract, JsonProperty member, String id) в Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateObject(JsonReader reader, Type objectType, JsonContract contract, JsonProperty member, JsonContainerContract containerContract, JsonProperty containerMember, Object existingValue) в Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateValueInternal(JsonReader reader, Type objectType, JsonContract contract, JsonProperty member, JsonContainerContract containerContract, JsonProperty containerMember, Object existingValue) в Newtonsoft.Json.Serialization.JsonSerializerInternalReader.Deserialize(JsonReader reader, Type objectType, Boolean checkAdditionalContent) в Newtonsoft.Json.JsonSerializer.DeserializeInternal(JsonReader reader, Type objectType) в Newtonsoft.Json.JsonConvert.DeserializeObject(String value, Type type, JsonSerializerSettings settings) в Newtonsoft.Json.JsonConvert.DeserializeObject[T](String value, JsonSerializerSettings settings) в Newtonsoft.Json.JsonConvert.DeserializeObject[T](String value) в ShikiTestApp.Program.Main(String[] args) в D:\Clouds\OneDrive\Documents\Visual Studio 2015\Projects\!Experemental\ShikiTestApp\ShikiTestApp\Program.cs:строка 18 в System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args) в System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args) в Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly() в System.Threading.ThreadHelper.ThreadStart_Context(Object state) в System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) в System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) в System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) в System.Threading.ThreadHelper.ThreadStart() InnerException:
Обнаружил, что если использовать List>, то

value

подхватывается, а

key

нет, ибо в json этот параметр называется

name

. Если изменить в json название параметра

name

на

key

, но всё работает идеально. Однако я не могу изменять формат выдачи ответа с сервера. Есть ли возможность как-то заставить ассоциировать

name

с ключём?
Если изменить в json название параметра name на key, но всё работает идеально.
Воистину, всё гениальное просто.. После получения json строки с сервера просто сделал замену Replace("name", "key") и его уже десериализовывал =D
Хотя.. использование List портит очень многое.. теперь нельзя обратиться к значению по ключу. Может всё же есть способ десериализовать это в словарь?

Решение задачи: «JSON сериализация в Key-Value»

textual
Листинг программы
  1. class Program
  2.     {
  3.         static void Main(string[] args)
  4.         {
  5.             string json = "{'rates_scores_stats':[{'name':10,'value':3551},{'name':9,'value':1002},{'name':8,'value':823},{'name':7,'value':493},{'name':6,'value':218},{'name':5,'value':139},{'name':4,'value':80},{'name':3,'value':41},{'name':2,'value':26},{'name':1,'value':83}],'rates_statuses_stats':[{'name':'Запланировано','value':2505},{'name':'Смотрю','value':7870},{'name':'Просмотрено','value':1949},{'name':'Отложено','value':1444},{'name':'Брошено','value':1358}]}";
  6.             var result = JsonConvert.DeserializeObject<MyClass>(json, new JsonSerializerSettings { Converters = new JsonConverter[] { new JsonGenericDictionaryOrArrayConverterNameValueMod() } });
  7.  
  8.             Console.WriteLine(result.rates_scores_stats[10] + " | " + result.rates_statuses_stats["Брошено"]);
  9.  
  10.             Console.ReadLine();
  11.         }
  12.     }
  13.     public class MyClass
  14.     {
  15.         public IDictionary<int, int> rates_scores_stats { get; set; }
  16.         public IDictionary<string, int> rates_statuses_stats { get; set; }
  17.     }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

5   голосов , оценка 4 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут