Subsonic 3 Newtonsoft JSON "Исключение из цикла самоссылки по ссылке" - PullRequest
1 голос
/ 13 декабря 2010

Привет. Я искал свою ошибку, но не могу найти ничего, что могло бы мне помочь. Проблема в этом. Я работал с Subsonic 3, Newtonsoft Json и способом записи linq, поэтому у меня простой запрос:

var found = from client in newclients.All() where client.Period == "sometext" select client;

string periodoJSON = JsonConvert.SerializeObject(periodoFound); //this get "Self referencing loop Exception"

проблема в том, что когда я запускаю этот скрипт, в строке JsonConvert появляется ужасное исключение «Исключение из цикла с самоссылкой», у subsonic все объекты без проблем, но если я делаю следующее.

var found = from client in newclients.All() where client.Period == "sometext" select new client{client.Name, client.LastName, etc};

string periodoJSON = JsonConvert.SerializeObject(periodoFound);

Я получаю сериализацию объекта с любой проблемой со всеми свойствами. Я делаю последний способ, потому что мне нужно закончить свою работу, но есть другой способ или решение этой проблемы, если нет, мне придется писать все свойства каждый раз, когда я хочу получить свойства полной таблицы.

надеюсь, что любой может решить мою проблему o помочь мне в пути для поиска решения ....


у меня действительно простой запрос с linq, и я пробую три значения для JsonSerializerSettings и любой работы, опять же, я работаю с subsonic 3, это не происходит ни с subsnoic 2, и я могу заставить его работать, если я укажу один хотя свойства объекта в запросе linq имеют какое-либо представление о том, что произошло, ЛЮБАЯ дополнительная помощь была бы полезна !!! Если я добавлю значение Serialize, моя страница сойдет с ума и перейдет в состояние цикла бесконечности, если я решу, что ошибка проста, не работает, и игнорируется, что ничего не происходит ... еще какая-то информация об этом цикле самоссылки?

var u = usuario.SingleOrDefault(x => x.TipoUsuario == "A" || x.TipoUsuario == "W");
JsonSerializerSettings setting = new JsonSerializerSettings();
setting.ReferenceLoopHandling = ReferenceLoopHandling.Error; //.Serialize .Ignore

Page.ClientScript.RegisterClientScriptBlock(this.GetType(),"usuario", "var usuario=" + JsonConvert.SerializeObject(u, Formatting.None, setting) + ";");

Обновление ------

Я кодирую следующее

string jsU = JsonConvert.SerializeObject(u,Formatting.None,new JsonSerializerSettings { PreserveReferencesHandling = PreserveReferencesHandling.Objects, ReferenceLoopHandling = ReferenceLoopHandling.Ignore });

и является рабочим, но единственное неправильное состоит в том, что в объекте json содержится вся информация о столбцах дозвуковой 3, и БОЛЬШОЙ кусок текста объясняет это ... кто-нибудь знает, как не ОТПРАВИТЬ эту часть объект ??

1 Ответ

5 голосов
/ 14 декабря 2010

Не зная больше о вашей объектной модели, трудно дать однозначный ответ, но я бы взглянул на перечисление ReferenceLoopHandling.

Вы звоните string SerializeObject(object value) на JsonConvert. Попробуйте вместо этого string SerializeObject(object value, Formatting formatting, JsonSerializerSettings settings) метод. Параметр JsonSerializerSettings settings позволяет вам установить множество вещей, включая свойство ReferenceLoopHandling ReferenceLoopHandling { get; set; }.

Вы можете попробовать эти значения:

public enum ReferenceLoopHandling
{
    Error,
    Ignore,
    Serialize
}

Очевидно, Error - это значение по умолчанию, и это то, что вы получаете. Возможно, один из других поможет.

...