JSON将自定义C#结构序列化为字符串,而不是对象
我看了各种各样的问题,但我不确定如何实现这一点 我有一个自定义结构,它目前没有公共属性。当它通过WebApi返回时(不进行任何奇特的序列化,只返回自定义结构本身),它将作为对象JSON将自定义C#结构序列化为字符串,而不是对象,c#,asp.net-mvc,json,serialization,struct,C#,Asp.net Mvc,Json,Serialization,Struct,我看了各种各样的问题,但我不确定如何实现这一点 我有一个自定义结构,它目前没有公共属性。当它通过WebApi返回时(不进行任何奇特的序列化,只返回自定义结构本身),它将作为对象{}返回 public struct CustomStruct { private string myProperty; ... public override string ToString() { return this.myProperty; } ..
{}
返回
public struct CustomStruct
{
private string myProperty;
...
public override string ToString()
{
return this.myProperty;
}
...
}
自定义结构本身是父类上的属性类型,它序列化为:
{ "MyProp1":"value1","MyProp2":"value2","MyCustomStruct":{} }
在自定义结构上重写ToString()时,我希望输出一个私有属性。在将对象作为JSON对象返回JavaScript land时,我是否可以实现类似的行为
例如,my private property是一个名为“myProperty”的字符串,设置为“test”。
如果我添加了一个名为“MyProperty”的公共属性,我将得到以下输出:
{ "MyProp1":"value1","MyProp2":"value2","MyCustomStruct":{ "MyProperty":"test" } }
当我真正想要的是:
{ "MyProp1":"value1","MyProp2":"value2","MyCustomStruct":"test" }
希望这是有意义的
以下是相关的问题,这些问题对我帮助不大。如果可能的话,我们希望避免使用JSON.NET,但如果这是唯一的方法,我们会这样做:
我现在所做的是在父CustomClass上添加第二个属性
public string MyCustomStructValue { get { return MyCustomStruct.ToString(); } }
然后将[IgnoreDataMember]
属性添加到原始属性
[IgnoreDataMember]
public CustomStruct MyCustomStruct { get; set; }
它可以通过以下操作正常工作:
public IEnumerable<CustomClass> Get()
{
return GetResults();
}
public IEnumerable Get()
{
返回GetResults();
}
我也面临同样的挑战。我通过编写一个自定义JsonConverter解决了这个问题,在转换时使用objects-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结果转换回对象,并且会因类型而异。当前用于序列化的是什么?i、 e.什么版本的WebAPI?如果它是最新版本,您已经在使用JSON.Net了,如果我没有弄错的话。MVC 4.Net 4.0。。。是的,有一个默认创建的对JSON.NET的引用,我可以使用它,现在我只是返回一个类集合,而不是ActionResult/ContentResult或类似的东西。