Я попытался сериализовать класс POCO, который был автоматически сгенерирован из Entity Data Model .edmx, и когда я использовал
JsonConvert.SerializeObject
Я получил следующую ошибку:
Произошла ошибка Самостоятельная ссылка на тип System.data.entity.
Как мне решить эту проблему?
json
serialization
json.net
NevenHuynh
источник
источник
async
вызова метода (aTask
) и забыл добавить префикс вawait
оператор.Ответы:
Это было лучшее решение https://code.msdn.microsoft.com/Loop-Reference-handling-in-caaffaf7
Исправление 1: глобальное игнорирование круговой ссылки
(Я выбрал / попробовал этот, как и многие другие)
Сериализатор json.net имеет возможность игнорировать циклические ссылки. Поместите следующий код в
WebApiConfig.cs
файл:Простое исправление заставит сериализатор игнорировать ссылку, которая вызовет цикл. Однако у него есть ограничения:
Если вы хотите использовать это исправление в не ASPI-проекте ASP.NET, вы можете добавить приведенную выше строку
Global.asax.cs
, но сначала добавьте:Если вы хотите использовать это в проекте .Net Core , вы можете изменить его
Startup.cs
следующим образом:Исправление 2: глобальное сохранение круговой ссылки
Это второе исправление похоже на первое. Просто измените код на:
Форма данных будет изменена после применения этой настройки.
$ Id и $ ref сохраняют все ссылки и делают уровень графа объекта плоским, но клиентский код должен знать об изменении формы, чтобы использовать данные, и это также применимо только к сериализатору JSON.NET.
Исправление 3: игнорировать и сохранять ссылочные атрибуты
Это исправление - атрибуты decorate в классе модели для управления поведением сериализации на уровне модели или свойства. Чтобы игнорировать свойство:
JsonIgnore - для JSON.NET, а IgnoreDataMember - для XmlDCSerializer. Чтобы сохранить ссылку:
JsonObject(IsReference = true)]
для JSON.NET и[DataContract(IsReference = true)]
для XmlDCSerializer. Обратите внимание: после примененияDataContract
к классу необходимо добавитьDataMember
свойства, которые вы хотите сериализовать.Атрибуты могут применяться как к сериализатору json, так и к сериализатору xml, что дает больше возможностей для управления классом модели.
источник
[JsonIgnore]
выше атрибута работает для меня.Используйте JsonSerializerSettings
ReferenceLoopHandling.Error
(по умолчанию) выдаст ошибку, если будет обнаружен ссылочный цикл. Вот почему вы получаете исключение.ReferenceLoopHandling.Serialize
полезно, если объекты вложены, но не бесконечно.ReferenceLoopHandling.Ignore
не будет сериализовать объект, если он сам по себе является дочерним объектом.Пример:
Если вам необходимо сериализовать объект, который вложен неопределенно долго, вы можете использовать PreserveObjectReferences, чтобы избежать StackOverflowException.
Пример:
Выберите, что имеет смысл для объекта, который вы сериализуете.
Ссылка http://james.newtonking.com/json/help/
источник
ReferenceLoopHandling = ReferenceLoopHandling.Ignore
для его работыReferenceLoopHandling.Serialize
заставит сериализатор войти в бесконечный рекурсивный цикл и переполнить стек.Исправление состоит в том, чтобы игнорировать ссылки на циклы, а не сериализовать их. Это поведение указано в
JsonSerializerSettings
.Холост
JsonConvert
с перегрузкой:Глобальная настройка с кодом
Application_Start()
в Global.asax.cs:Ссылка: https://github.com/JamesNK/Newtonsoft.Json/issues/78
источник
Самый простой способ сделать это - установить Json.NET из nuget и добавить
[JsonIgnore]
атрибут к виртуальному свойству в классе, например:Хотя в наши дни я создаю модель только с теми свойствами, через которые я хочу пройти, поэтому она легче, не содержит нежелательных коллекций и не теряет свои изменения при перестройке сгенерированных файлов ...
источник
В .NET Core 1.0 вы можете установить это как глобальный параметр в вашем файле Startup.cs:
источник
Если вы используете .NET Core 2.x, обновите раздел ConfigureServices в Startup.cs
https://docs.microsoft.com/en-us/ef/core/querying/related-data#related-data-and-serialization
Если вы используете .NET Core 3.x без MVC, это будет:
Такая обработка ссылочных циклов практически обязательна, если вы используете Entity Framework и шаблон проектирования на основе базы данных.
источник
services.AddMvc()
?Чтобы сериализовать нас в NEWTONSOFTJSON, когда у вас есть проблема с циклом, в моем случае мне не нужно было изменять global.asax или apiconfig. Я просто использую JsonSerializesSettings, игнорируя обработку циклов.
источник
Newtonsoft.Json.JsonConvert.SerializeObject(objToSerialize, new Newtonsoft.Json.JsonSerializerSettings() {ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore});
Мы можем добавить эти две строки в конструктор класса DbContext, чтобы отключить цикл Self-ссылки, например
источник
Вы также можете применить атрибут к свойству.
[JsonProperty( ReferenceLoopHandling = ... )]
Атрибут хорошо подходит для этого.Например:
Надеюсь, это поможет, Jaans
источник
Чтобы игнорировать ссылки на циклы и не сериализовать их глобально в MVC 6, используйте в файле startup.cs следующее:
источник
Используйте это в
WebApiConfig.cs
классе:источник
Для меня я должен был пойти другим путем. Вместо того, чтобы пытаться исправить сериализатор JSON.Net, мне пришлось пойти после «Ленивой загрузки» в моем тексте данных.
Я просто добавил это в свой базовый репозиторий:
Объект context является параметром конструктора, который я использую в своем базовом репозитории, потому что я использую внедрение зависимостей. Вместо этого вы можете изменить свойство ProxyCreationEnabled, где бы вы ни создавали свой текстовый текст.
http://techie-tid-bits.blogspot.com/2015/09/jsonnet-serializer-and-error-self.html
источник
У меня было это исключение, и мое рабочее решение легко и просто,
Игнорируйте свойство Referenced, добавив в него атрибут JsonIgnore:
Сбросьте свойство при его десериализации:
используя Newtonsoft.Json;
источник
[JsonIgnore]
Команда:
Это работает с ASP.NET Core; Сложность заключается в том, как «настроить параметр на игнорирование». В зависимости от того, как вы настраиваете ваше приложение, оно может быть довольно сложным. Вот что сработало для меня.
Это может быть размещено в вашем общедоступном разделе ConfigureServices (IServiceCollection services).
источник
Люди уже говорили о добавлении [JsonIgnore] к виртуальному свойству в классе, например:
Я также поделюсь другим вариантом, [JsonProperty (NullValueHandling = NullValueHandling.Ignore)], который пропускает свойство из сериализации, только если оно имеет значение null:
источник
Для .NET Core 3.0 обновите класс Startup.cs, как показано ниже.
См .: https://devblogs.microsoft.com/aspnet/asp-net-core-updates-in-net-core-3-0-preview-5/.
источник
Просто поместите
Configuration.ProxyCreationEnabled = false;
в контекстный файл; это решит проблему.источник
Моя проблема решена с помощью пользовательской конфигурации JsonSerializerSettings:
источник
Также убедитесь, что вы используете await и async в вашем методе. Вы можете получить эту ошибку, если ваш объект не сериализован должным образом.
источник
Я столкнулся с той же проблемой, и я пытался использовать JsonSetting, чтобы игнорировать ошибку самоссылки, это своего рода работа, пока я не получил класс, который ссылается очень глубоко, и мой процесс точка-сеть зависает от значения записи Json.
Моя проблема
Вы можете увидеть проблему в классе User, который ссылается на CompanyUser класс который является .
Теперь я вызываю метод GetAll, который включает все реляционные свойства.
На этом этапе мой процесс DotNetCore зависает при выполнении JsonResult, записи значения ... и никогда не наступит. В моем Startup.cs я уже установил JsonOption. По какой-то причине EFCore включает вложенное свойство, которое я не прошу Ef давать.
ожидаемое поведение должно быть этим
тогда
на этом этапе я должен получить только этот «Company.CompanyUsers.First (). User.DisplayName», и он не должен давать мне Company.CompanyUsers.First (). User.CompanyUsers, который вызывает проблему с самоссылкой ; Технически это не должно давать мне User.CompanyUsers, так как CompanyUsers является навигационным свойством. Но EfCore очень взволнован и дает мне User.CompanyUsers .
Итак, я решил написать метод расширения для свойства, которое должно быть исключено из объекта (это на самом деле не исключает, а просто устанавливает для свойства значение null). Мало того, что он также будет работать со свойствами массива. ниже приведен код, который я также собираюсь экспортировать в пакет nuget для других пользователей (не уверен, поможет ли это кому-нибудь). Причина проста, потому что мне лень писать .Select (n => new {n.p1, n.p2});Я просто не хочу писать оператор выбора, чтобы исключить только 1 свойство!
Это не лучший код (я обновлю его на каком-то этапе), поскольку я написал на скорую руку, и хотя это может помочь тем, кто хочет исключить (установить значение NULL) в объекте также с массивами.
Приведенный выше класс расширений даст вам возможность установить для свойства значение null, чтобы избежать появления в цикле самоссылки даже массивов.
Построитель выражений
Обычаи:
Модельные классы
Фиктивные данные
случаи:
Случай 1: исключить только свойство без какого-либо массива
Случай 2: исключить свойство с 1 массивом
Случай 3: исключить свойство с 2 вложенными массивами
Случай 4: запрос EF GetAll с включениями
Вы заметили, что метод Explode () также является методом расширения только для нашего построителя выражений, чтобы получить свойство из свойства массива. Когда есть свойство массива, используйте .Explode (). YourPropertyToExclude или .Explode (). Property1.MyArrayProperty.Explode (). MyStupidProperty . Приведенный выше код помогает мне избежать самореференции настолько глубоко, насколько я хочу. Теперь я могу использовать GetAll и исключить свойство, которое мне не нужно!
Спасибо за чтение этого большого поста!
источник
Для того, чтобы не зацикливание это работало для меня
ReferenceLoopHandling = ReferenceLoopHandling.Ignore,
Я решил все это здесь - сериализация дочерних платформ Entity Framework с помощью .Net Core 2 WebAPI https://gist.github.com/Kaidanov/f9ad0d79238494432f32b8407942c606
Буду признателен за любые замечания. Может быть, кто-то может использовать это когда-нибудь.
источник
Код C #:
источник
Мне понравилось решение, которое делает это,
Application_Start()
как в ответе здесьОчевидно, я не мог получить доступ к объектам json в JavaScript, используя конфигурацию в моей функции, как в ответе DalSoft, так как возвращаемый объект имел «\ n \ r» по всему (key, val) объекта.
В любом случае, что бы ни работало, это здорово (потому что разные подходы работают в разных сценариях на основе комментариев и заданных вопросов), хотя стандартный способ сделать это предпочтительнее с хорошей документацией, поддерживающей подход.
источник