4

さまざまな質問を見てきましたが、これを実装する方法がわかりません。

現在、パブリック プロパティを持たないカスタム構造体があります。WebApi 経由で返される場合 (特別なシリアル化は行わず、カスタム構造体自体を返すだけです)、 object として返されます{}

public struct CustomStruct
{
    private string myProperty;

    ...

    public override string ToString()
    {
      return this.myProperty;
    }

    ...

}

カスタム構造体自体は、次のようにシリアル化される親クラスのプロパティの型です。

{ "MyProp1":"value1","MyProp2":"value2","MyCustomStruct":{} }

カスタム構造体で ToString() をオーバーライドするときに、プライベート プロパティの 1 つを出力したいと考えています。オブジェクトを JSON オブジェクトとして JavaScript ランドに返すときに、同様の動作を実現できますか?

たとえば、私のプライベート プロパティは、「test」に設定された「myProperty」という文字列です。「MyProperty」というパブリック プロパティを追加すると、次の出力が得られます。

{ "MyProp1":"value1","MyProp2":"value2","MyCustomStruct":{ "MyProperty":"test" } }

私が本当に欲しいのは:

{ "MyProp1":"value1","MyProp2":"value2","MyCustomStruct":"test" }

これが理にかなっていることを願っています。

これは、あまり役に立たなかった関連する質問です。可能であれば JSON.NET の使用を避けたいと考えていますが、それが唯一の方法である場合はそれを使用します。

JSON.Net 構造体のシリアル化の不一致

C# カスタム json シリアル化

カスタム シリアライザーを使用した JSON.NET をカスタム オブジェクトに

列挙型の文字列としての JSON シリアル化

JavaScriptSerializer.Deserialize - フィールド名を変更する方法

4

2 に答える 2

4

私も同じ課題に直面しました。変換時にオブジェクトの ToString メソッドを使用するカスタム JsonConverter を作成して解決しました。

public class ToStringConverter : JsonConverter
{
    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        writer.WriteValue(value.ToString());
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        throw new NotImplementedException();
    }

    public override bool CanConvert(Type objectType)
    {
        return true;
    }
}

そして、次のように JsonConverter 属性として使用します。

[JsonConverter(typeof(ToStringConverter))]
public AnotherObjectWithToString MyObject { get; set; }

逆シリアル化では ToString の結果をオブジェクトに変換する必要があり、型によって異なるため、これはシリアル化にのみ使用できることに注意してください。

于 2013-12-10T12:43:54.430 に答える
1

私が今行ったことは、親の CustomClass クラスに2番目のプロパティを追加することです...

public string MyCustomStructValue { get { return MyCustomStruct.ToString(); } }

[IgnoreDataMember]次に、属性を元のプロパティに追加します...

[IgnoreDataMember]
public CustomStruct MyCustomStruct { get; set; }

これは、次のアクションで正常に機能します。

public IEnumerable<CustomClass> Get()
{
    return GetResults();
}
于 2013-08-19T08:41:08.340 に答える