112

xml ファイルを .net c# オブジェクトにシリアル化した後、返された json で k_BackingField を取得しています。

DataContract と DataMember 属性を .net c# オブジェクトに追加しましたが、json のクライアント エンドでは何も得られません。

[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")]
}

返される json の例:

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

13 に答える 13

64

デフォルトの WebApi シリアライザーは、その "__BackingField:" 構文を c# 自動プロパティに追加します。これを App_Start の WebConfig に追加して、探しているきれいな json を取得します。

using Newtonsoft.Json;
...

config.Formatters.JsonFormatter.SerializerSettings = new JsonSerializerSettings();
于 2016-02-26T19:11:10.703 に答える
47

クラスをシリアル化で使用できる場合、自動プロパティ構文は実際には推奨されません。バッキングフィールドである理由は、コードがコンパイルされるたびに異なる可能性があるコンパイラによって生成されます。これにより、クラスに変更が加えられていなくても (コードを再コンパイルするだけで)、非互換性の問題が発生する可能性があります。

この場合、DataMember 属性を適用すると問題が解決すると思います。ただし、クラスをシリアル化で使用する必要がある場合は、完全なプロパティ構文を使用することをお勧めします。

于 2012-10-23T01:27:52.117 に答える
37

[Serializable]従来の方法を使用してシリアル化できるようにマークされているオブジェクトがいくつかありますが、Web API で使用するために JSON できれいにシリアル化する必要があります。に設定IgnoreSerializableAttributeするtrueと、Newtonsoft.Json が Microsoft のシリアライザーのように動作するのを停止し、代わりにパブリック プロパティをシリアル化します。

TLDR: これを WebApiConfig.cs に追加します。

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

司会者: 何度か出された質問に対する本当に良い回答を削除するのではなく、重複した質問を削除してください。これは有効な質問に対する有効な回答です。

于 2016-04-28T09:24:39.553 に答える
8

いくつかのオプション:

  1. [Serializable]モデルから削除

  2. [DataContract][DataMember]をモデルに 追加します[Serializable]

  3. に下の行を追加App_Start/WebApiConfig.cs

config.Formatters.JsonFormatter.SerializerSettings = new JsonSerializerSettings();
于 2017-05-01T15:51:07.260 に答える
2

属性DataContractJsonSerializerを持つ別のアセンブリのクラスで使用していました。Serializable出力には「k__BackingField」が含まれていました。Serializable(他のアセンブリで)属性を削除すると、これが修正されました。理由がわからない。

于 2014-12-11T00:07:51.717 に答える
0

MVC プロジェクト内でこの問題が発生していると仮定すると、@Html.JsonData の使用を置き換えるのは非常に簡単であることがわかりました。過去に私のために働いたコードのスニペットを次に示します。

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

エレガントではありませんが、ピンチではシンプルです。

于 2014-02-12T18:26:58.113 に答える
0

私の場合、このエラーは Newtonsoft.Json バージョンのものでした。サーバーは 6.0.0 バージョンを探し、私は 11.0 を持っていたので、バージョン 6.0.0 をインストールする必要がありました。

于 2019-08-21T20:38:53.080 に答える
0

クラスに次のような自己参照プロパティがある場合、この問題が発生しました。

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

そしてその結果、その人は自分自身と友達になりました。結果セットに自己参照オブジェクトがないことを確認しました。お役に立てれば。

于 2017-10-19T19:21:36.333 に答える
0

[Serializable] 属性を使用する必要があったため、削除することはできませんでした。

XmlSerializer は WebApi の [XmlAttribute] を無視します

上記の解決策で解決しました。

GlobalConfiguration.Configuration.Formatters.XmlFormatter.UseXmlSerializer = true;
于 2018-10-24T07:15:21.010 に答える
-2

友よ、次のようなプロパティを宣言しないでください。

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

しかし、昔のように補助変数を作成してください....

private String discretionCode;

public String DiscretionCode 
{ 
    get { return discretionCode;}
    set { discretionCode = value; }
}
于 2016-02-11T12:18:24.657 に答える