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

标签 c# asp.net-mvc json serialization struct

我看过各种问题,但不确定如何实现。

我有一个自定义结构,目前没有公共(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

C# custom json serialization

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/

相关文章:

c# - Lucene 带有过滤器的空查询字符串

json - 无法在循环中访问寄存器变量

c# - 方法属性 TestMethod 和 TestMethod() 之间有什么区别?

c# - 同一引用程序集的多个版本

asp.net-mvc - 如何 : PageView and Controllers inheritance in ASP. NET MVC

asp.net-mvc - Ninject 绑定(bind)到不同的 Controller

javascript - 访问json数组元素

javascript - 如何知道从服务器获取的JSON数据是对象还是字符串?

c# - 如果 ResourceDictionary 放置在 ListBox DataTemplate 上的 UserControl 内,它是否会为每个项目加载它?

javascript - 如何在 MVC 中将 .aspx 页面呈现为模式