我看过各种问题,但不确定如何实现。
我有一个自定义结构,目前没有公共(public)属性。当它通过 WebApi 返回时(不进行任何花哨的序列化,只返回自定义结构本身),它作为对象 {}
返回。
public struct CustomStruct
{
private string myProperty;
...
public override string ToString()
{
return this.myProperty;
}
...
}
自定义结构本身是父类属性的类型,序列化为:
{ "MyProp1":"value1","MyProp2":"value2","MyCustomStruct":{} }
当我在自定义结构上覆盖 ToString() 时,我想输出一个私有(private)属性。当将对象作为 JSON 对象返回到 JavaScript 领域时,我能否实现类似的行为?
例如我的私有(private)属性是一个字符串,名为“myProperty”,设置为“test”。 如果我添加一个名为“MyProperty”的公共(public)属性,我将得到以下输出:
{ "MyProp1":"value1","MyProp2":"value2","MyCustomStruct":{ "MyProperty":"test" } }
当我真正想要的是:
{ "MyProp1":"value1","MyProp2":"value2","MyCustomStruct":"test" }
希望这是有道理的。
以下是对我帮助不大的相关问题。如果可能的话,我想避免使用 JSON.NET,但如果这是唯一的方法,我会这样做:
JSON.Net Struct Serialization Discrepancy
JSON.NET with Custom Serializer to a custom object
JSON serialization of enum as string
JavaScriptSerializer.Deserialize - how to change field names
最佳答案
我遇到了同样的挑战。我通过编写一个在转换时使用对象 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 结果转换回对象,并且这会因类型而异。
关于c# - JSON 将自定义 C# 结构序列化为字符串,而不是对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18277636/