Сериализация списка пар «Имя-значение» с исключением частей «Ключ» и «Значение» - PullRequest
1 голос
/ 01 мая 2020

У меня есть класс ниже

using System;
using System.Collections.Generic;
using System.Text;
using Newtonsoft.Json;

namespace mynamespace
{
    public class Incident
    {
        [JsonProperty("name")]
        public string Name { get; set; }

        [JsonProperty("components")]
        public List<KeyValuePair<string, string>> Components { get; set; }

        public Incident()
        {
            Components = new List<KeyValuePair<string, string>>();
        }
    }
}

Если у меня есть объект, в который я добавляю одну NameValuePair с ключом ddd и значением dssds ...

При преобразовании это Json

В настоящее время я получаю

{
  "name": "test",
  "components": [{ "Key": "ddd", "Value": "dssds" }]
}

Мне нужно

{
   "name": "test",
   "components": {
       "ddd": "dssds"
   }
}

Я сериализую с

var json = JsonConvert.SerializeObject(incident);

Как я могу это сделать это? Я предполагаю, что мне нужен какой-то конвертер?

Одно из предложений:

var test = new { name = incident.Name, components = incident.Components.Select(i => i.Value) };
var json = JsonConvert.SerializeObject(test);

Это генерирует

{
  "name":"test",
  "components":["dssds"]
}

Что не соответствует моему требуемому json выше

Пол

1 Ответ

0 голосов
/ 01 мая 2020

Чтобы получить желаемый результат, Components должно быть Dictionary<string, string>, а не List<KeyValuePair<string, string>>. Таким образом, самое простое решение - изменить свой класс таким образом:

public class Incident
{
    [JsonProperty("name")]
    public string Name { get; set; }

    [JsonProperty("components")]
    public Dictionary<string, string> Components { get; set; }

    public Incident()
    {
        Components = new Dictionary<string, string>();
    }
}

Fiddle: https://dotnetfiddle.net/Mx4Z8U

Конечно, недостатком этого решения является то, что вы теперь нужно обновить весь код, который использует Incident для работы с Dictionary вместо List. В зависимости от того, сколько существует зависимостей, вы можете или не хотите делать это.

Итак, второе простейшее решение - создать суррогатное свойство Dictionary<string, string> в классе, который использует List<KeyValuePair<string, string>> в качестве своего источник данных. Это может быть приватно, если хотите. Переместите атрибут [JsonProperty("components")] на новый Dictionary и пометьте List<KeyValuePair<string, string>> вместо [JsonIgnore]. Таким образом, у вас будет это:

public class Incident
{
    [JsonProperty("name")]
    public string Name { get; set; }

    [JsonIgnore]
    public List<KeyValuePair<string, string>> Components { get; set; }

    [JsonProperty("components")]
    private Dictionary<string, string> ComponentDictionary
    {
        get { return Components != null ? new Dictionary<string, string>(Components) : null; }
    }

    public Incident()
    {
        Components = new List<KeyValuePair<string, string>>();
    }
}

Скрипка: https://dotnetfiddle.net/Po22Yt

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...