JsonConvert.SerializeObject изменяет порядок сортировки полей в JSON ⇐ C#

Место общения программистов C#
Anonymous
JsonConvert.SerializeObject изменяет порядок сортировки полей в JSON

Сообщение Anonymous »

Код: Выделить всё

JsonConvert.SerializeObject
изменяет порядок сортировки полей в JSON, если вы вызываете метод .GetProperty для сериализуемого объекта в дочернем потоке.

Код: Выделить всё

class Program
{

static void Main(string[] args)
{
var tasks = new List();
for (int i = 0; i < 10; i++)
{
var task = Task.Factory.StartNew(() =>
{
var token = CreateRandomToken();

_ = typeof(TestObject).GetProperty("Version");

var str = JsonConvert.SerializeObject(token);

Console.WriteLine(str);
});

tasks.Add(task);
}

Task.WaitAll(tasks.ToArray());

Console.ReadLine();
}

private static TestObject CreateRandomToken()
=> new TestObject { TokenHash = "123456789", Name = "Name", Version = "123" };

}

public class TestObject
{
public string TokenHash { get; set; }

public string Name { get; set; }

public string Version { get; set; }
}
В результате выполнения этого кода на консоли отобразится следующее:
[img]https://i .sstatic.net/r7RJc.png[/img]

Поле «Версия» находится в начале JSON, а не в конце
< р>Если удалим

Код: Выделить всё

_ = typeof(TestObject).GetProperty("Version");
  • тогда сортировка полей не изменится
    или если вы вызовете код в основном потоке, то и сортировка не изменится
Изображение

если я украшу свой объект атрибутами [JsonProperty (Order = 1)] то сортировка будет не такая, как я указал в атрибутах
Как это исправить? исправить без использования атрибута [JsonProperty (Order = 1)]
Обновлено:
Мы используем строку JSON для создания цифрового подпись, если порядок полей изменится, цифровая подпись не будет действительна, поэтому для меня важен порядок полей

Подробнее здесь: https://stackoverflow.com/questions/701 ... ds-in-json

Вернуться в «C#»