Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/275.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JSON将自定义C#结构序列化为字符串,而不是对象_C#_Asp.net Mvc_Json_Serialization_Struct - Fatal编程技术网

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

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; } ..

我看了各种各样的问题,但我不确定如何实现这一点

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

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或类似的东西。