Код: Выделить всё
public static readonly JsonSerializerOptions serializerOptions = new()
{
TypeInfoResolver = new DefaultJsonTypeInfoResolver
{
Modifiers =
{
AlphabetizeProperties,
}
}
}
private static void AlphabetizeProperties(JsonTypeInfo info)
{
if (info.Kind != JsonTypeInfoKind.Object) return;
List sortedProperties = [];
sortedProperties.AddRange(info.Properties);
sortedProperties.Sort((p1, p2) => string.CompareOrdinal(p1.Name, p2.Name));
info.Properties.Clear();
for (int i = 0; i < sortedProperties.Count; i++)
{
sortedProperties[i].Order = i;
info.Properties.Add(sortedProperties[i]);
}
}
Вещи, которые я пробовал:
jsonsourcegenerationoptions не имеет никакого способа информировать модификаторы. Jsonserializercontext . В статическом конструкторе я могу инициализировать jsoneserializeroptions , вручную построить новый экземпляр моего jsonserializercontext и перезаписать свойство по умолчанию . Это похоже на подход, используемый здесь, для другой цели. Однако зависимость круговая; Мне нужен Jsonserializeroptions , чтобы инициализация jsonserializercontext , поэтому я могу вызвать withAdddedmodifiers , и мне нужно передать jsonserializercontext jsonserializeroptions.typeinforesolver инициализировать его. Jsontypeinfo экземпляр через jsonserializercontext.default.myobject и вызов alphabetizeproperties непосредственно на нем. Это бросает InvalidoperationException с помощью следующего сообщения: этот экземпляр JSonTyPeInfo помечен только для чтения или уже использовался в сериализации или десеризации. За исключением этого радикального шага, есть ли способ достичь того, что я ищу?
Подробнее здесь: https://stackoverflow.com/questions/797 ... generation
Мобильная версия