JSON.Net Self referencing loop detected

前端 未结 11 725
伪装坚强ぢ
伪装坚强ぢ 2020-11-28 04:18

I have a mssql database for my website within 4 tables.

When I use this:

public static string GetAllEventsForJSON()
{
    using (CyberDBDataContext d         


        
相关标签:
11条回答
  • 2020-11-28 04:46

    I just had the same problem with Parent/Child collections and found that post which has solved my case. I Only wanted to show the List of parent collection items and didn't need any of the child data, therefore i used the following and it worked fine:

    JsonConvert.SerializeObject(ResultGroups, Formatting.None,
                            new JsonSerializerSettings()
                            { 
                                ReferenceLoopHandling = ReferenceLoopHandling.Ignore
                            });
    

    JSON.NET Error Self referencing loop detected for type

    it also referes to the Json.NET codeplex page at:

    http://json.codeplex.com/discussions/272371

    Documentation: ReferenceLoopHandling setting

    0 讨论(0)
  • 2020-11-28 04:47

    The fix is to ignore loop references and not to serialize them. This behaviour is specified in JsonSerializerSettings.

    Single JsonConvert with an overload:

    JsonConvert.SerializeObject((from a in db.Events where a.Active select a).ToList(), Formatting.Indented,
        new JsonSerializerSettings() {
            ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore
        }
    );
    

    If you'd like to make this the default behaviour, add a Global Setting with code in Application_Start() in Global.asax.cs:

    JsonConvert.DefaultSettings = () => new JsonSerializerSettings {
         Formatting = Newtonsoft.Json.Formatting.Indented,
         ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore
    };
    

    Reference: https://github.com/JamesNK/Newtonsoft.Json/issues/78

    0 讨论(0)
  • 2020-11-28 04:50

    The JsonSerializer instance can be configured to ignore reference loops. Like in the following, this function allows to save a file with the content of the json serialized object:

        public static void SaveJson<T>(this T obj, string FileName)
        {
       
           JsonSerializer serializer = new JsonSerializer();
            serializer.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
            using (StreamWriter sw = new StreamWriter(FileName))
            {
                using (JsonWriter writer = new JsonTextWriter(sw))
                {
                    writer.Formatting = Formatting.Indented;
                    serializer.Serialize(writer, obj);
                }
            }
        }
    
    0 讨论(0)
  • 2020-11-28 04:53

    This may help you.

    public MyContext() : base("name=MyContext") 
    { 
        Database.SetInitializer(new MyContextDataInitializer()); 
        this.Configuration.LazyLoadingEnabled = false; 
        this.Configuration.ProxyCreationEnabled = false; 
    } 
    

    http://code.msdn.microsoft.com/Loop-Reference-handling-in-caaffaf7

    0 讨论(0)
  • 2020-11-28 04:53

    Sometimes you have loops becouse your type class have references to other classes and that classes have references to your type class, thus you have to select the parameters that you need exactly in the json string, like this code.

    List<ROficina> oficinas = new List<ROficina>();
    oficinas = /*list content*/;
    var x = JsonConvert.SerializeObject(oficinas.Select(o => new
                {
                    o.IdOficina,
                    o.Nombre
                }));
    
    0 讨论(0)
  • 2020-11-28 05:01

    If using ASP.NET Core MVC, add this to the ConfigureServices method of your startup.cs file:

    services.AddMvc()
        .AddJsonOptions(
            options => options.SerializerSettings.ReferenceLoopHandling =            
            Newtonsoft.Json.ReferenceLoopHandling.Ignore
        );
    
    0 讨论(0)
提交回复
热议问题