JSON.Net স্ব-রেফারেন্সিং লুপ সনাক্ত হয়েছে


111

4 টি টেবিলের মধ্যে আমার ওয়েবসাইটের জন্য আমার একটি এমএসকিউএল ডাটাবেস রয়েছে।

যখন আমি এটি ব্যবহার করি:

public static string GetAllEventsForJSON()
{
    using (CyberDBDataContext db = new CyberDBDataContext())
    {
        return JsonConvert.SerializeObject((from a in db.Events where a.Active select a).ToList(), new JavaScriptDateTimeConverter());
    }
}

কোড নিম্নলিখিত ফলাফলের ফলাফল:

নিউটনসফট.জসন.জসনসরিয়ালাইজেশন এক্সপেশন: 'ডিএল.সাইবারউজার' টাইপের সাথে সম্পত্তি 'সাইবারউসার' এর জন্য স্ব-রেফারেন্সিং লুপ সনাক্ত হয়েছে। পাথ '[0] .পরিবর্তনমূলক নিবন্ধসমূহ [0]। সাইবারউসার.ইউসারলোগস [0]'।



আপনি যদি দয়া করে আমার উত্তরটিকে সঠিক হিসাবে চিহ্নিত করেন? @ কোভু
মুহাম্মদ ওমর এলশোরবাগী

উত্তর:


211

আমি কেবল পিতামাতা / শিশু সংগ্রহের ক্ষেত্রে একই সমস্যা পেয়েছিলাম এবং সেই পোস্টটি পেয়েছি যা আমার ক্ষেত্রে সমাধান করেছে solved আমি কেবল পিতামাতাদের সংগ্রহের আইটেমের তালিকাটি দেখাতে চেয়েছিলাম এবং সন্তানের কোনও ডেটার দরকার নেই, তাই আমি নিম্নলিখিতটি ব্যবহার করেছি এবং এটি দুর্দান্ত কাজ করেছে:

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

JSON.NET ত্রুটি স্বতঃপ্রকাশের লুপ টাইপের জন্য সনাক্ত হয়েছে

এটি এখানে Json.NET কোডপ্লেক্স পৃষ্ঠায় রেফারেন্স করে:

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

ডকুমেন্টেশন: রেফারেন্সলুপ হ্যান্ডলিং সেটিং


2
মামলার উপর নির্ভর করে আপনি PreserveReferencesHandling = PreserveReferencesHandling.Objects;এখানে বর্ণিত হিসাবে ব্যবহার করতে পারেন : সল্ফ-রেফারেন্সিং-লুপ-ইস্যু-যখন-নিউটোনসফট-জেসন ব্যবহার করছেন
দিমিত্রি ট্রঙ্কোকো

ওয়েবএপিআই ওডেটা ভি 4-তে, আমি দেখেছি যে কিছু ধরণের ডেটা রেফারেন্সলুপ হ্যান্ডলিং উভয়েরই প্রয়োজন। উপেক্ষা করুন এবং সংরক্ষণ করুন রেফারেন্সস হ্যান্ডলিং Oঅবজেক্টস
ক্রিস শ্যাচলার

1
অ্যালেলুয়াইয়া গান গায় তাই আপনাকে ধন্যবাদ 1 এর মধ্যে কেবল আপ- ভোটিংই যথেষ্ট নয়
জেপি চ্যাপেলো

42

ফিক্সটি হ'ল লুপ রেফারেন্সগুলি উপেক্ষা করা এবং সেগুলি ক্রিয়াকলাপ না করা। এই আচরণটি নির্দিষ্ট করা আছে JsonSerializerSettings

JsonConvertএকটি ওভারলোডের সাথে একক :

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

আপনি যদি এটি ডিফল্ট আচরণ করতে চান তবে Global.asax.cs এ কোড সহ একটি গ্লোবাল সেটিং যুক্ত করুন Application_Start():

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

তথ্যসূত্র: https://github.com/JamesNK/Newtonsoft.Json/issues/78


3
এটির সাথে সিরিয়ালায়ন করতে আমার খুব দীর্ঘ সময় লাগে
ড্যানিয়েল

বিজ্ঞপ্তিযুক্ত লুপগুলি সহ যখন অবজেক্টটি এনএইচবারনেট মডেল পোকো হয় তখন এটি কাজ করবে বলে মনে হয় না (সেক্ষেত্রে সিরিয়ালাইজেশনটি এক টন আবর্জনা উদ্ধার করে বা কখনও কখনও সময় বেরিয়ে যায়)।
ফার্নান্দো গঞ্জালেজ সানচেজ

"ইসসিকিউরিটিসেফিট্রিটিক্যাল": মিথ্যা, "ইসসিকিউরিটি ট্রান্সপারেন্ট": মিথ্যা, "মেথডহ্যান্ডল": {"মান": {"মান": 140716810003120} "," গুণাবলী ": 150," কলিংকনভেনশন ": 1," রিটার্নটাইপ ":" সিস্টেম.ভয়েড , System.Private.CoreLib, সংস্করণ = 4.0.0.0, সংস্কৃতি = নিরপেক্ষ, পাবলিককি টোকেন = 7cec85d7bea7798e "," রিটার্নটাইপ কাস্টমঅ্যাট্রিবিউটস ": {" প্যারামিটারটাইপ ":" সিস্টেম.ভয়েড, সিস্টেম.প্রাইভেট.কোরলিব, সংস্করণ = 4.0.0.0, সংস্কৃতি = নিরপেক্ষ, পাবলিককিটোকেন = 7cec85d7bea7798e "," নাম ": নাল," হাসডাফাল্টভ্যালু ": সত্য," ডিফল্টভ্যালু ": নাল," RawDefaultValue ": নাল," মেটাডাটাটোকেন ": 134217728," বৈশিষ্ট্য ": 1," অবস্থান ": -, "ISIN": মিথ্যা, "IsLcid": মিথ্যা ,. ... ইত্যাদি

37

যদি এএসপি.নেট কোর এমভিসি ব্যবহার করে থাকেন তবে এটি আপনার স্টার্টআপ। সি ফাইলের কনফিগার সার্ভিস পদ্ধতিতে যুক্ত করুন:

services.AddMvc()
    .AddJsonOptions(
        options => options.SerializerSettings.ReferenceLoopHandling =            
        Newtonsoft.Json.ReferenceLoopHandling.Ignore
    );

2
আমি নিশ্চিত করেছি যে এই সমাধানটি ওয়েবএপিআই এন্টি ফ্রেমওয়ার্ক কোর 2.0 এর সাথেও কাজ করে
-মোয়া

13

এটি আপনাকে সাহায্য করতে পারে।

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


4
আপনি যদি অ্যাসিঙ্ক পদ্ধতি ব্যবহার করেন তবে এটির কাছে যাওয়ার সর্বোত্তম উপায়। এটি একটি বাস্তব ব্যথা হতে পারে তবে এটি আপনার অন্যথায় (এটি সহ) প্রচুর পরিমাণে সমস্যা সমাধান করে এবং আরও বেশি পারফরম্যান্স হতে পারে কারণ আপনি কেবল যা ব্যবহার করবেন তা অনুসন্ধান করছেন।
জোশ ম্যাককেরিন

আপনার xyz.edmx এ, xyz.Context.vb ফাইলটি খুলুন যা ডিফল্টরূপে লুকানো থাকবে। এই থাকবে codeজন উপ নতুন () Mybase.New ( "নাম = EntityConName") শেষ সাব code। এখন শেষ সাব-এর আগে codeMe.Configration.LazyLoadingEn ਯੋਗ = মিথ্যা আমার.কমফিগারেশন.প্রক্সি ক্রিয়েশনএনবলড = মিথ্যা code যা ওয়েবপি থেকে আপনার জেসন আউটপুটে 'সেলফ রেফারেন্সিং লুপ' ত্রুটি থেকে মুক্তি পাবে।
ভেঙ্কট

আমি এটি আমার জন্য কাজ করে না। আমি AsNoTracking () ব্যবহার করেছি এবং এটি এটি ঠিক করেছে। অন্য কাউকে সাহায্য করতে পারেন
স্কটসানপেড্রো

@ স্কটসানপেট্রো যদি আমরা আপনার কোডটি দেখতে পেতাম তবে এটি আরও ভাল ছিল।
ddagsan

6

আপনাকে অবশ্যই অবজেক্ট রেফারেন্স সংরক্ষণ করতে হবে:

var jsonSerializerSettings = new JsonSerializerSettings
{
    PreserveReferencesHandling = PreserveReferencesHandling.Objects
};

তারপর আপনার প্রশ্নের কল var q = (from a in db.Events where a.Active select a).ToList();মত

string jsonStr = Newtonsoft.Json.JsonConvert.SerializeObject(q, jsonSerializerSettings);

দেখুন: https://www.newtonsoft.com/json/help/html/Pre সংরক্ষণObjectReferences.htm


4

আপনার মডেল শ্রেণিতে "[জসনআইগনআর]" যুক্ত করুন

{
  public Customer()
  {
    Orders = new Collection<Order>();
  }

public int Id { get; set; }
public string Name { get; set; }
public string Surname { get; set; }

[JsonIgnore]
public ICollection<Order> Orders { get; set; }
}

3

আমি ডট.নেট কোর ৩.১ ব্যবহার করছি এবং অনুসন্ধান করেছি did

"নিউটনসফট.জসন.জসনসরিয়ালাইজেশন এক্সপেশন: সম্পত্তির জন্য স্ব-রেফারেন্সিং লুপ সনাক্ত করা হয়েছে"

আমি এটি এই প্রশ্নের সাথে যুক্ত করছি, কারণ এটি একটি সহজ রেফারেন্স হবে। আপনার স্টার্টআপ.সি ফাইলগুলিতে নিম্নলিখিতটি ব্যবহার করা উচিত:

 services.AddControllers()
                .AddNewtonsoftJson(options =>
                {
                    // Use the default property (Pascal) casing
                    options.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
                    options.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
                });

2

As.net মূল 3.1.3 জন্য এটি আমার জন্য কাজ করেছে

services.AddControllers().AddNewtonsoftJson(opt=>{
            opt.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore;
        });

1

JsonConvert.SerializeObject(ObjectName, new JsonSerializerSettings(){ PreserveReferencesHandling = PreserveReferencesHandling.Objects, Formatting = Formatting.Indented });


6
যদিও এই কোডটি প্রশ্নের উত্তর দিতে পারে, কেন এবং / অথবা এই কোডটির প্রশ্নের উত্তর কীভাবে তার দীর্ঘমেয়াদী মানকে উন্নত করে তা সম্পর্কিত অতিরিক্ত প্রসঙ্গ সরবরাহ করে।
অ্যালেক্স রিয়াবভ

1

কখনও কখনও আপনার কাছে লুপ থাকে আপনার টাইপ ক্লাসের অন্যান্য ক্লাসের সাথে রেফারেন্স থাকে এবং ক্লাসগুলিতে আপনার টাইপ শ্রেণীর রেফারেন্স থাকে, সুতরাং আপনাকে এই কোডটির মতো জেসন স্ট্রিংয়ের ঠিক প্যারামিটারগুলি নির্বাচন করতে হবে।

List<ROficina> oficinas = new List<ROficina>();
oficinas = /*list content*/;
var x = JsonConvert.SerializeObject(oficinas.Select(o => new
            {
                o.IdOficina,
                o.Nombre
            }));
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.