4

我已经查看了各种问题,但我不确定如何实现这一点。

我有一个自定义结构,它目前没有公共属性。当它通过 WebApi 返回时(不做任何花哨的序列化,只是返回自定义结构本身),它作为 object 返回{}

public struct CustomStruct
{
    private string myProperty;

    ...

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

    ...

}

自定义结构本身是父类属性的类型,它序列化为:

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

当我在自定义结构上覆盖 ToString() 时,我想输出其中一个私有属性。将对象作为 JSON 对象返回到 JavaScript-land 时,我可以实现类似的行为吗?

例如,我的私有属性是一个字符串,称为“myProperty”,设置为“test”。如果我添加了一个名为“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

我面临同样的挑战。我通过编写一个自定义 JsonConverter 来解决它,它在转换时使用对象 ToString 方法:

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 类上添加第二个属性......

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 回答