Сериализация списка объектов в один объект JSON со свойством в качестве ключа - PullRequest
0 голосов
/ 19 октября 2018

Можно ли с помощью Newtonsoft Json.NET использовать одно из свойств сериализуемого класса (через коллекцию) в качестве ключа для этого класса?

Например, возьмите следующие классы в C #

public class MyClass
{
  public string UniqueId { get; set; }
  public string Value { get; set; }
}
public class MyCollection : List<MyClass>
{ }

Если я выполню следующее для сериализации коллекции ...

var col = new MyCollection() {
    new MyClass { UniqueId = "First", Value = "This") },
    new MyClass { UniqueId = "Second", Value = "That") }
};
string json = JsonConvert.SerializeObject(col);

Это приведет к следующему JSON с массивомсодержащий каждый MyClass.

[
  {
    "UniqueId": "First",
    "Value": "This"
  },
  {
    "UniqueId": "Second",
    "Value": "That"
  }
]

Есть ли способ заставить Newtonsoft создать вместо этого следующее, где объект (а не массив) создается с каждым классом, на который ссылается UniqueIdсвойство как ключ?

{
  "First":
  {
    "Value": "This"
  },
  "Second":
  {
    "Value": "That"
  }
}

Или если проще ...

{
  "First":
  {
    "UniqueId": "First",
    "Value": "This"
  },
  "Second":
  {
    "UniqueId": "Second",
    "Value": "That"
  }
}

Я знаю, что использование Dictionary<> приведет к тому, что я хочу, поиспользуя то же значение из свойства, что и ключ ... однако это неупорядоченный , и мне нужен List<>, так что все в порядке.

Ответы [ 2 ]

0 голосов
/ 19 октября 2018

Сильно типизированная альтернатива OrderedDictionary - используйте List<KeyValuePair<key, value>> с Dictionary.

Итак, учитывая следующую модель:

public class MyClass
{
    public string UniqueId { get; set; }
    public string Value { get; set; }
}

И следующие экземпляры:

var first = new MyClass {UniqueId = "First", Value = "This"};
var second = new MyClass {UniqueId = "Second", Value = "That"};
var third = new MyClass {UniqueId = "Third", Value = "Foo"};
var fourth = new MyClass {UniqueId = "Fourth", Value = "Bar"};

Вместо создания и инициализации Dictionary, как это:

var dictionary = new Dictionary<string, MyClass>
{
    { first.UniqueId, first },
    { second.UniqueId, second },
    { third.UniqueId, first },
    { fourth.UniqueId, first },
};

Мы можем создать и инициализировать список KeyValuePair, а затем создать Dictionary:

var pairs = new List<KeyValuePair<string, MyClass>>
{
    new KeyValuePair<string, MyClass>(first.UniqueId, first),
    new KeyValuePair<string, MyClass>(second.UniqueId, second),
    new KeyValuePair<string, MyClass>(third.UniqueId, third),
    new KeyValuePair<string, MyClass>(fourth.UniqueId, fourth),
};

var dictionary = new Dictionary<string, MyClass>(pairs);

. При этом порядок элементов будет добавлен в список KeyValuePair.Сериализация Dictionary:

string json = JsonConvert.SerializeObject(dictionary, Formatting.Indented);

Вывод json следующий:

{
  "First": {
    "UniqueId": "First",
    "Value": "This"
  },
  "Second": {
    "UniqueId": "Second",
    "Value": "That"
  },
  "Third": {
    "UniqueId": "Third",
    "Value": "Foo"
  },
  "Fourth": {
    "UniqueId": "Fourth",
    "Value": "Bar"
  }
}
0 голосов
/ 19 октября 2018

OrderedDictionary может использоваться для сохранения порядка добавленных элементов или SortedDictionary для сортировки элементов по ключу .

Учитывая следующую модель:

public class MyClass
{
    public string UniqueId { get; set; }
    public string Value { get; set; }
}

И следующие экземпляры:

var first = new MyClass {UniqueId = "First", Value = "This"};
var second = new MyClass {UniqueId = "Second", Value = "That"};
var third = new MyClass {UniqueId = "Third", Value = "Foo"};
var fourth = new MyClass {UniqueId = "Fourth", Value = "Bar"};

Использование OrderedDictionary

var dictionary = new OrderedDictionary()
{
    { first.UniqueId, first },
    { second.UniqueId, second },
    { third.UniqueId, first },
    { fourth.UniqueId, first },
};

string json = JsonConvert.SerializeObject(dictionary, Formatting.Indented);

Это сохранит порядокдобавленные предметы.Выходные данные json следующие:

{
  "First": {
    "UniqueId": "First",
    "Value": "This"
  },
  "Second": {
    "UniqueId": "Second",
    "Value": "That"
  },
  "Third": {
    "UniqueId": "First",
    "Value": "This"
  },
  "Fourth": {
    "UniqueId": "First",
    "Value": "This"
  }
}

Использование SortedDictionary

var first = new MyClass {UniqueId = "First", Value = "This"};
var second = new MyClass {UniqueId = "Second", Value = "That"};
var third = new MyClass {UniqueId = "Third", Value = "Foo"};
var fourth = new MyClass {UniqueId = "Fourth", Value = "Bar"};

var dictionary = new SortedDictionary<string, MyClass>
{
    { first.UniqueId, first },
    { second.UniqueId, second },
    { third.UniqueId, first },
    { fourth.UniqueId, first },
};

string json = JsonConvert.SerializeObject(dictionary, Formatting.Indented);

Это позволит отсортировать элементы по ключу (Fourth это 2-й элемент, а не 4-й).Выходные данные json следующие:

{
  "First": {
    "UniqueId": "First",
    "Value": "This"
  },
  "Fourth": {
    "UniqueId": "First",
    "Value": "This"
  },
  "Second": {
    "UniqueId": "Second",
    "Value": "That"
  },
  "Third": {
    "UniqueId": "First",
    "Value": "This"
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...