JSON将自定义C#结构序列化为字符串,而不是Object

本文关键字:Object 字符串 自定义 结构 序列化 JSON | 更新日期: 2023-09-27 18:28:06

我研究了各种问题,但不确定如何实现。

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

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

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

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

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

例如,我的私有属性是一个名为"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-如何更改字段名

JSON将自定义C#结构序列化为字符串,而不是Object

我也面临同样的挑战。我通过编写一个自定义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结果转换回对象,并且这将因类型而异。

我现在所做的是在父CustomClass类上添加第二个属性。。。

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

则将CCD_ 2属性添加到原始属性。。。

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

它可以通过以下操作正常工作:

public IEnumerable<CustomClass> Get()
{
    return GetResults();
}