2012-10-23 11 views
75

Otrzymuję K_BackingField w moim zwróconym json po serializacji pliku xml do obiektu C# .net.Jak usunąć k__BackingField z json gdy Deserialize

Dodałem atrybut DataContract i DataMember do obiektu .net C#, ale nie otrzymuję niczego na końcu json, na kliencie.

[XmlRoot("person")] 
[Serializable] 
public class LinkedIn 
{ 
    [XmlElement("id")] 
    public string ID { get; set; } 

    [XmlElement("industry")] 
    public string Industry { get; set; } 

    [XmlElement("first-name")] 
    public string FirstName { get; set; } 

    [XmlElement("last-name")] 
    public string LastName { get; set; } 
    [XmlElement("headline")] 
} 

Przykład zwróconej json:

home: Object 
<FirstName>k__BackingField: "Storefront" 
<LastName>k__BackingField: "Doors" 

Odpowiedz

37

składnia Automatyczne Nieruchomość jest rzeczywiście nie zaleca się, jeśli klasa może być używana w serializacji. Powód będący polem podkładu jest generowany przez kompilator, który może być inny przy każdym kompilowaniu kodu. Może to powodować problemy z niekompatybilnością, nawet jeśli nie wprowadzono żadnych zmian w klasie (tylko rekompilacja kodu).

Myślę, że zastosowanie atrybutu DataMember rozwiąże problem w tym przypadku. Ale poleciłbym użyć pełnej składni właściwości, jeśli klasa musi być używana w serializacji.

+0

Lol, realizowany wersji długiej i ustawić prywatnych pól do client.home: Przedmiot _fName: "sklepowa" _headline: "CEO StorefrontDoors.NET" _id: "" _industry: "" –

+17

dodanie ten datacrract na górze klasy i datamember do każdej właściwości, która mnie interesuje działa. –

+2

@ AlumCloud.Com +1 dla [DataContract] i [DataMember]. Nie zapomnij dodać: System.Runtime.Serialization –

0

Zakładając, że widzisz ten problem w projekcie MVC, odkryłem, że bardzo łatwo jest zastąpić użycie @ Html.JsonData. Oto fragment kodu, który sprawdził się w przeszłości:

<input type="hidden" id="Model" value="@Html.Raw(new System.Web.Script.Serialization.JavaScriptSerializer().Serialize(Model))" /> 

Nie tak elegancko, ale prosto w szczyptę.

1

Używałem DataContractJsonSerializer z klasą z innego zestawu, który miał atrybut Serializable. Dane wyjściowe zawierały "k__BackingField". Usunięcie atrybutu Serializable (w drugim zespole) rozwiązało ten problem. Nie pewny dlaczego.

70

Usuń [Serializable] z klasy

+2

Teraz zastanawiam się, dlaczego pomyślałem, że potrzebuję [Serializable] w pierwszej kolejności. Moja serializacja Xml działa bez, a JSON działa bez niego. – Rhyous

+11

To nie działa z usługami WCF. Zwracając ładunek za pomocą usług RESTful, nie powstają żadne dane, jeśli usuniesz [Serializable]. Dodaj System.Runtime.Serialization i użyj [DataContract] dla klasy, [DataMember] dla właściwości. –

+0

Ta odpowiedź I Ian komentarz wydaje się obejmować oba przypadki. Do WCF lub nie do WCF, to jest pytanie. – granadaCoder

8

Proste Proste i Godna sposób narażać dane musimy narażać się dane obiektu do łatwego formacie czytelnym i spójnym


Najpierw usuń [Serializable]

[Serializable] 

teraz dodać [DataContract] w klasie i [DataMember] własności jak poniżej przykład

[DataContract] 
public class UserDiscretion : UserReport 
{ 
    [DataMember] 
    public String DiscretionCode { get; set; } 
    public String DiscretionDescription { get; set; } 
} 

nadzieję, że to pomaga
Dzięki.

+0

Jeśli korzystasz z Web API, nie ma potrzeby dodawania atrybutów DataContract i DataMember - po prostu zwróć obiekt i zostanie on automatycznie zserializowany. –

+0

Jeśli ktoś rozpoczyna prace od podstaw, warto użyć Web API , który zapewni typ zwracany przez obiekt, który nie będzie wymagał żadnego rodzaju rzutowania typu do wyświetlania klientowi. Ale jeśli chodzi o pytanie @ AlumCloud.com, jeśli jest on w istniejącej aplikacji, to rozwiązaniem problemu będzie Najpierw usuń [Serializable] , a następnie dodaj [DataContract] w klasie i [DataMember] w przypadku właściwości takiej jak poniżej zgodnie z sugestią – Rinku

-1

Przyjaciele, nie deklaruje właściwości tak:

public String DiscretionCode { get; set; } 
public String DiscretionDescription { get; set; } 

Ale tworzyć auxiliar Vars, jak stary ....

private String discretionCode; 

public String DiscretionCode 
{ 
    get { return discretionCode;} 
    set { discretionCode = value; } 
} 
+1

Dlaczego ? Czy możesz dać rezon? – Lucenty

+0

@Lucenty daje taki JSON .. [{"discreationCode": "x"}], podczas serializacji. –

+0

Ale tego właśnie można się spodziewać - w ten sposób JSON serializuje dane. I myślę, że kod z pomocniczymi vars da taki sam wynik. – Lucenty

30

Domyślna WebAPI serializer doda, że ​​„__BackingField: "składnia do auto-właściwości C#. Dodaj to do swojego WebConfig w App_Start, aby uzyskać czystszy wygląd json, którego być może szukasz.

config.Formatters.JsonFormatter.SerializerSettings = new JsonSerializerSettings(); 
+1

Naprawiono problem. Myślę, że właściwości auto są czyste. Używanie pól wsparcia wszędzie wydaje się głupie. i wprowadza dużo bałaganu, a czasem zamieszanie. –

+0

To zadziałało dla mnie. W moim przypadku miałem już istniejącą klasę, która była już używana przez serwisy WCF i ASMX, więc nie mogłem po prostu zmienić jej dla mojego nowego projektu WebAPI. – samiup

+0

Pytanie brzmi, dlaczego na serialu WebApi serializer doda domyślnie "__BackingField:"? –

20

Mamy kilka obiektów, które są oznaczone jako [Serializable] więc mogą być serializowane przy użyciu tradycyjnych metod, które jednak musimy mieć czysto w odcinkach w JSON do użytku z Web API. Ustawienie IgnoreSerializableAttribute na true spowoduje zatrzymanie Newtonsoft.Json od zachowywania się jak serializatory firmy Microsoft, a zamiast tego będzie serializować właściwości publiczne.

TLDR: Dodaj do tego WebApiConfig.cs:

((Newtonsoft.Json.Serialization.DefaultContractResolver)config.Formatters.JsonFormatter.SerializerSettings.ContractResolver).IgnoreSerializableAttribute = true; 

Moderator: Zamiast usuwania naprawdę dobrą odpowiedź na pytanie, które zostało zadane kilka razy, proszę usunąć duplikaty pytanie. To jest poprawna odpowiedź na ważne pytanie.

+0

To powinna być właściwa odpowiedź. Usunięcie serializacji lub użycie atrybutów datacontract i datamember nie zawsze jest właściwym rozwiązaniem. –

2

Inne rozwiązanie, które może pomóc w przypadku JSON.NET. Może wystarczyć, aby oznaczyć klasę atrybutem [Newtonsoft.Json.JsonObject].

Pracowałem z klasami cs zbudowanymi z xsd i dodawałem pewne właściwości przy użyciu klas częściowych. Po serializacji json właściwości te zostały oznaczone k_BackingField. Ustawienia JsonFormatter wspomniane w innych odpowiedziach również pomogły, ale łatwiej było oznaczyć klasę cząstkową atrybutem [JsonObject].

2

kilka opcji:

  1. Usuń [Serializable] od modelu

  2. Dodaj [DataContract] i [DataMember] do modelu wraz z [Serializable]

  3. Dodaj poniżej linii App_Start/WebApiConfig.cs

config.Formatters.JsonFormatter.SerializerSettings = new JsonSerializerSettings(); 
+0

To działa dla mnie. Naprawdę pomocny. – gdmanandamohon

+0

Działa również dla mnie. Dzięki. – gdmanandamohon

0

Miałem ten problem, gdy mam właściwości self reference w mojej klasie, takie jak;

class Person { 
List<Person> Friends { get; set;} 
} 

I był rezultat, człowiek był przyjacielem samym sobą. Po prostu upewniłem się, że w moim zestawie wyników nie ma obiektów samoczynnych odwołań. Mam nadzieję że to pomoże.

Powiązane problemy