Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# .NET WebApi如何防止$参考文件:&引用;x";JSON的输出_C#_Asp.net_Json_Asp.net Web Api_Asp.net Web Api2 - Fatal编程技术网

C# .NET WebApi如何防止$参考文件:&引用;x";JSON的输出

C# .NET WebApi如何防止$参考文件:&引用;x";JSON的输出,c#,asp.net,json,asp.net-web-api,asp.net-web-api2,C#,Asp.net,Json,Asp.net Web Api,Asp.net Web Api2,我将WebAPI与实体框架一起使用,我有一个名为Gift的控制器,当客户端获得Api时,我将使用实体框架从DB获得所有礼物,并将其作为JSON返回 这是我的控制器功能 正如您所看到的,“$ref”:“13”、“$ref”:“14”等等。。。我不想在json的底部显示$refs,我不想要$refs。我想要一个常规JSON文件 这是我的WebApiConfig.cs 我可以用一种非常神秘的方式解决这个问题我在web.config文件中添加一个新的空行并保存它,然后再次调用API,一切正常 但在1-2

我将WebAPI与实体框架一起使用,我有一个名为Gift的控制器,当客户端获得Api时,我将使用实体框架从DB获得所有礼物,并将其作为JSON返回

这是我的控制器功能

正如您所看到的,“$ref”:“13”、“$ref”:“14”等等。。。我不想在json的底部显示$refs,我不想要$refs。我想要一个常规JSON文件

这是我的WebApiConfig.cs

我可以用一种非常神秘的方式解决这个问题我在web.config文件中添加一个新的空行并保存它,然后再次调用API,一切正常

但在1-2小时后,开始使用$ref发送数据,直到我在web.config文件中添加一个新的空行。

Json.net将
“$id”
“$ref”
添加到序列化的Json中,以处理循环引用。您的
Gift
对象包含
GiftCategory
,而它又包含
Gift
对象的列表

引用处理由
preserverencesshandling
serializer设置控制,但是将
SerializerSettings.preserverencesshandling
设置为
preserverencesshandling.None
在具有循环引用的情况下不适用,因为这将导致数据丢失
Json.net
足够聪明,不会让你在自己的腿上开枪

您可以尝试将
ReferenceLoopHandling
设置为
ReferenceLoopHandling.Ignore
,如本文所述, 但是,由于序列化的特定顺序,
Gift
对象将在第一个引用位置序列化。因此,他们中的一些人将进入
Gifts
数组,一些人将进入
GiftCategory
。有关更多详细信息,请参见此

因此,可能的解决办法是:

<> >首先,建议不要序列化EF实体。

  • 如果应用程序的业务逻辑实际上不需要导航属性
    GiftCategory.Gifts
    ,则可以将其从模型实体中删除。然后,您将不再有循环引用,序列化的JSON将不再有
    “$ref”
    “$id”
    字段


  • 我这样解决了这个问题

    您必须编写app.config:

    public static class WebApiConfig
    {
        public static void Register(HttpConfiguration config)
        {
            config.Formatters.JsonFormatter.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore;
        }
    }
    
    结果:

    {
        "Id": 1,
        "Name": "Hasan Batuhan",
        "Surname": "Kurt",
        "Email": "mail@mail.com,
        "PhoneNumber": "09999999999",
        "Orders": [{
            "Id": 1,
            "BasketId": 1,
            "OrderDate": "2015-11-07T00:00:00+03:00"
        }]
    }
    

    结果:

    {
        "$id": "1",
        "Id": 1,
        "Name": "Hasan Batuhan",
        "Surname": "Kurt",
        "Email": "mail@mail.com",
        "PhoneNumber": "09999999999",
        "Orders": {
            "$id": "2",
            "$values": [{
                "$id": "3",
                "Id": 1,
                "BasketId": 1,
                "OrderDate": "2015-11-07T00:00:00+03:00",
                "Customer": {
                    "$ref": "1"
                }
            }]
        }
    }
    

    您想要什么
    GiftCategory.Gifts[]
    ?从JSON可以明显看出,它是对所有引用它的
    Gift
    对象的反向引用。
    {
            "$id": "1",
            "ID": 14,
            "GiftName": "Sinbo SVC-3438 1600 Watt Elektrikli Süpürge",
            "Image": "http://placehold.it/400x288.jpg/A6A",
            "Stock": 70,
            "Price": 260,
            "Description": "Az yer kaplayan Kompakt dizayn, Max. 1600W, 5m kablo uzunluğu, 360 derece dönüş açılı ön tekerlek, Dar ve ulaşılması zor yerler için 2 si 1 arada aparat ",
            "Status": "Active",
            "GiftCode": "BDRS-498",
            "GiftCategoryID": 4,
            "CreatedAt": "2016-12-19T12:59:01.31",
            "UpdatedAt": "2016-12-19T12:59:10.54",
            "Featured": false,
            "GiftCategory": {
              "$id": "2",
              "ID": 4,
              "Name": "Kişisel Bakım",
              "CountryID": 1,
              "Country": null,
              "Gifts": [
                {
                  "$ref": "1"
                },
                {
                  "$id": "3",
                  "ID": 11,
                  "GiftName": "Kişisel Bakım 2 - LG 43LH590V 43\"108 Ekran Full HD",
                  "Image": "http://placehold.it/400x288.jpg/AEA",
                  "Stock": 50,
                  "Price": 3600,
                  "Description": "Triple XD Engine teknolojisiyle güçlendirilen, Active Noise Reduction ve Real Cinema 24p özellikleriyle zenginleştirilen 1080p çözünürlüğündeki LED aydınlatmalı 55 inçlik ekrana sahip model, size ideal sinema keyfi sunuyor. Aynı zamanda sahip olduğu Color Prime, Dynamic Clear White ve Dynamic Colour Enhancer özellikleri sayesinde kusursuz bir görüntüyle evlerinizde yerini alıyor.",
                  "Status": "Active",
                  "GiftCode": "BDRS-495",
                  "GiftCategoryID": 4,
                  "CreatedAt": "2016-12-19T12:59:01.31",
                  "UpdatedAt": "2016-12-19T12:59:10.54",
                  "Featured": false,
                  "GiftCategory": {
                    "$ref": "2"
                  },
                  "CartItems": []
                },
                {
                  "$id": "4",
                  "ID": 8,
                  "GiftName": "Kişisel Bakım 1 - Apple iPhone 6S 16 GB",
                  "Image": "http://placehold.it/400x288.jpg/CCC",
                  "Stock": 100,
                  "Price": 5000,
                  "Description": "Teknolojinin sunduğu tüm imkanlardan yararlanılarak tasarlanan Apple iPhone 6S , hem işlevsel hem de görsel açıdan ayrıcalıklı bir akıllı telefona sahip olmanıza olanak tanıyor.",
                  "Status": "Active",
                  "GiftCode": "BDRS-492",
                  "GiftCategoryID": 4,
                  "CreatedAt": "2016-12-19T12:59:01.31",
                  "UpdatedAt": "2016-12-19T12:59:10.54",
                  "Featured": false,
                  "GiftCategory": {
                    "$ref": "2"
                  },
                  "CartItems": []
                }
              ]
            },
            "CartItems": []
          },
          {
            "$id": "5",
            "ID": 13,
            "GiftName": "Beyaz Eşyalar 2 - Philips Marathon Ultimate FC9919/07 A Sınıfı Toz Torbasız Elektrikli Süpürge",
            "Image": "http://placehold.it/400x288.jpg/A1A",
            "Stock": 70,
            "Price": 900,
            "Description": "Yeni Philips Marathon Ultimate torbasız elektrikli süpürge, üstün temizlik performansı sunar. PowerCyclone 7, havayla tozu olağanüstü bir performansla ayırır. TriActiveMax başlık ise tüm zeminlerde mükemmel performans gösterir.",
            "Status": "Active",
            "GiftCode": "BDRS-497",
            "GiftCategoryID": 2,
            "CreatedAt": "2016-12-19T12:59:01.31",
            "UpdatedAt": "2016-12-19T12:59:10.54",
            "Featured": false,
            "GiftCategory": {
              "$id": "6",
              "ID": 2,
              "Name": "Beyaz Eşyalar",
              "CountryID": 1,
              "Country": null,
              "Gifts": [
                {
                  "$ref": "5"
                },
                {
                  "$id": "7",
                  "ID": 6,
                  "GiftName": "Beyaz Eşyalar 1 - Samsung Galaxy S7 Edge",
                  "Image": "http://placehold.it/400x288.jpg/EEE",
                  "Stock": 100,
                  "Price": 6000,
                  "Description": "Teknolojik yeniliklerin nereye kadar ulaşacağını kestiremeyen kullanıcılar, Samsung’un geliştirdiği ve bünyesinde barındırdığı yenilikçi özelliklerle öne çıkan telefonlarla şaşırmaya devam ediyor. Galaxy serisi içerisindeki en agresif atılımları üzerinde bulunduran Samsung Galaxy S7 Edge modelleri;alüminyum çerçeveleri, güçlü donanımları, benzersiz kameraları, suya ve toza karşı dayanıklılıkları ve sanal gerçeklik aygıtlarına doğrudan bağlanabilmeleriyle benzersiz hale geliyorlar.",
                  "Status": "Active",
                  "GiftCode": "BDRS-490",
                  "GiftCategoryID": 2,
                  "CreatedAt": "2016-12-19T12:59:01.31",
                  "UpdatedAt": "2016-12-19T12:59:10.54",
                  "Featured": false,
                  "GiftCategory": {
                    "$ref": "6"
                  },
                  "CartItems": []
                }
              ]
            },
            "CartItems": []
          },
          {
            "$id": "8",
            "ID": 7,
            "GiftName": "Elektronik 1 - Samsung Galaxy J7",
            "Image": "http://placehold.it/400x288.jpg/DDD",
            "Stock": 1000,
            "Price": 2500,
            "Description": "eknolojik yenilikleri yakından takip eden herkesin kullandığı akıllı cep telefonları, gelişmiş donanım ve yazılım özelliklerinin yanı sıra üzerlerinde bulunan kameralarla daha da kullanışlı hale geliyor. Dünya çapında milyonlarca kullanıcıya ulaşan ve akıllı cep telefonu sektörüne yön veren başlıca markalardan biri olan Samsung, Galaxy serisi içerisine konumlandırdığı Samsung Galaxy J7 modeliyle kendinden söz ettiriyor. ",
            "Status": "Active",
            "GiftCode": "BDRS-491",
            "GiftCategoryID": 3,
            "CreatedAt": "2016-12-19T12:59:01.31",
            "UpdatedAt": "2016-12-19T12:59:10.54",
            "Featured": false,
            "GiftCategory": {
              "$id": "9",
              "ID": 3,
              "Name": "Elektronik ",
              "CountryID": 1,
              "Country": null,
              "Gifts": [
                {
                  "$ref": "8"
                },
                {
                  "$id": "10",
                  "ID": 12,
                  "GiftName": "Elektronik  2 - Samsung 40JU6070 40\" 102 Ekran Ultra HD",
                  "Image": "http://placehold.it/400x288.jpg/A6A",
                  "Stock": 62,
                  "Price": 3200,
                  "Description": "TV standında kullanılabilen model, A enerji verimlilik sınıfında yer alıyor. Samsung 40JU6070 fiyatı kullanıcı açısından tercih edilir olmasında önemli bir rol oynuyor.4K teknolojisiyle yeni tanışacak olanların rahatlıkla yönelebilecekleri model, zengin giriş - çıkış noktalarıyla da cazip seçenekler arasında yer alıyor. Slim yapısı, pratik kullanımı ve gerek donanım gerekse yazılım anlamında Samsung’un elektronik alandaki deneyiminin bir eseri olarak nitelenebilecek akıllı televizyon, salon ya da oturma odalarınızın en sevilen eşyalarından biri oluyor.",
                  "Status": "Active",
                  "GiftCode": "BDRS-496",
                  "GiftCategoryID": 3,
                  "CreatedAt": "2016-12-19T12:59:01.31",
                  "UpdatedAt": "2016-12-19T12:59:10.54",
                  "Featured": false,
                  "GiftCategory": {
                    "$ref": "9"
                  },
                  "CartItems": []
                }
              ]
            },
            "CartItems": []
          },
          {
            "$id": "11",
            "ID": 9,
            "GiftName": "Küçük Ev Aletleri 1 - General Mobile 4G Android One",
            "Image": "http://placehold.it/400x288.jpg/BBB",
            "Stock": 150,
            "Price": 2600,
            "Description": "General Mobile 4G , diğer akıllı telefon modellerinden farklı olarak Google iş birliği ile geliştirilen Türkiye'deki ilk Android One cihaz olma özelliğine sahip ve bu yüzden benzeri bulunmayan eşsiz bir ürün.",
            "Status": "Active",
            "GiftCode": "BDRS-493",
            "GiftCategoryID": 5,
            "CreatedAt": "2016-12-19T12:59:01.31",
            "UpdatedAt": "2016-12-19T12:59:10.54",
            "Featured": false,
            "GiftCategory": {
              "$id": "12",
              "ID": 5,
              "Name": "Küçük Ev Aletleri",
              "CountryID": 1,
              "Country": null,
              "Gifts": [
                {
                  "$ref": "11"
                }
              ]
            },
            "CartItems": []
          },
          {
            "$id": "13",
            "ID": 10,
            "GiftName": "Elektrikli Ev Aletleri 2 - Samsung 40J5070 40\" 102 Ekran Full HD",
            "Image": "http://placehold.it/400x288.jpg/AAA",
            "Stock": 50,
            "Price": 3000,
            "Description": "\r\nMarkaların ortaya koydukları televizyon modelleri, farklı donanım ve yazılım özellikleriyle öne çıkıyor. Gelişmiş 3D yetenekleri ve 4K çözünürlükleriyle sunulan bazı ürünler, sahip oldukları aygıttan çok sayıda özellik bekleyenlerin gereksinimlerini kolayca karşılıyor.",
            "Status": "Active",
            "GiftCode": "BDRS-494",
            "GiftCategoryID": 1,
            "CreatedAt": "2016-12-19T12:59:01.31",
            "UpdatedAt": "2016-12-19T12:59:10.54",
            "Featured": false,
            "GiftCategory": {
              "$id": "14",
              "ID": 1,
              "Name": "Elektrikli Ev Aletleri",
              "CountryID": 1,
              "Country": null,
              "Gifts": [
                {
                  "$ref": "13"
                },
                {
                  "$id": "15",
                  "ID": 5,
                  "GiftName": "Elektrikli Ev Aletleri 1 - Iphone 7 Plus 128GB",
                  "Image": "http://placehold.it/400x288.jpg/FFF",
                  "Stock": 200,
                  "Price": 7500,
                  "Description": "Apple markası iPhone serisi altında sunduğu cihazların arasına geçtiğimiz yıllarda Plus serisini de eklemişti. iPhone 7 cihazının yanı sıra sunulan iPhone 7 Plus , yüksek özellikleri ve normal iPhone’a göre büyük ekranı ile büyük ekran beklentisi olanların ihtiyacını karşılamayı hedefliyor.",
                  "Status": "Active",
                  "GiftCode": "BDRS-489",
                  "GiftCategoryID": 1,
                  "CreatedAt": "2016-12-19T12:59:01.31",
                  "UpdatedAt": "2016-12-19T12:59:10.54",
                  "Featured": false,
                  "GiftCategory": {
                    "$ref": "14"
                  },
                  "CartItems": []
                }
              ]
            },
            "CartItems": []
          },
          {
            "$ref": "10"
          },
          {
            "$ref": "3"
          },
          {
            "$ref": "4"
          },
          {
            "$ref": "7"
          },
          {
            "$ref": "15"
          }
        ]
    
         public static void Register(HttpConfiguration config)
            {
    
                config.SuppressDefaultHostAuthentication();
                config.Filters.Add(new HostAuthenticationFilter(OAuthDefaults.AuthenticationType));
                config.Formatters.JsonFormatter.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore;
                config.Formatters.JsonFormatter.SerializerSettings.PreserveReferencesHandling = Newtonsoft.Json.PreserveReferencesHandling.None;
    .....
    
    public static class WebApiConfig
    {
        public static void Register(HttpConfiguration config)
        {
            config.Formatters.JsonFormatter.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore;
        }
    }
    
    {
        "Id": 1,
        "Name": "Hasan Batuhan",
        "Surname": "Kurt",
        "Email": "mail@mail.com,
        "PhoneNumber": "09999999999",
        "Orders": [{
            "Id": 1,
            "BasketId": 1,
            "OrderDate": "2015-11-07T00:00:00+03:00"
        }]
    }
    
    public static class WebApiConfig
    {
        public static void Register(HttpConfiguration config)
        {
            config.Formatters.JsonFormatter.SerializerSettings.PreserveReferencesHandling = Newtonsoft.Json.PreserveReferencesHandling.All;
        }
    }
    
    {
        "$id": "1",
        "Id": 1,
        "Name": "Hasan Batuhan",
        "Surname": "Kurt",
        "Email": "mail@mail.com",
        "PhoneNumber": "09999999999",
        "Orders": {
            "$id": "2",
            "$values": [{
                "$id": "3",
                "Id": 1,
                "BasketId": 1,
                "OrderDate": "2015-11-07T00:00:00+03:00",
                "Customer": {
                    "$ref": "1"
                }
            }]
        }
    }