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

Место общения программистов 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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

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