如何使用Json.Net将对象序列化为JSON字符串属性而不是对象

时间:2014-10-13 17:23:04

标签: c# json json.net

我有以下类结构。我想要实现的是将Bar序列化为JSON中的对象,将其序列化为具有内部属性Name值的字符串,并忽略Id属性。我没有需要反序列化它的场景,但是我必须从数据库加载Bar对象与其他属性并进行一些内部操作但不使用它进行传输。

class Foo
{
    [JsonProperty("bar")]
    public Bar Bar { get; set; }
}

class Bar
{
    [JsonIgnore]
    public Guid Id { get; set; }
    [JsonProperty]
    public string Name { get; set; }
}

预期的JSON:

{
    bar: "test"
}

1 个答案:

答案 0 :(得分:3)

使用自定义JsonConverter,您可以控制转换以输出您想要的任何内容。

类似的东西:

    public class BarConverter : JsonConverter
    {

        public override bool CanConvert(Type objectType)
        {
            return objectType == typeof(Bar);
        }

        public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
        {
            var bar = value as Bar;
            serializer.Serialize(writer, bar.Name);
        }

        public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
        {
              // Note: if you need to read to, you'll need to implement that here too
              // otherwise just throw a NotImplementException and override `CanRead` to return false
              throw new NotImplementedException();
        }
    }

然后,您可以使用Bar装饰您的属性或Bar类(取决于您是否总是希望JsonConverterAttribute像这样序列化,或仅针对此属性):

[JsonConverter(typeof(BarConverter))]
public Bar Bar { get; set; }

或者:

[JsonConverter(typeof(BarConverter))]
public class Bar

另一种“快速而肮脏”的方法是只拥有一个将被序列化的 shadow 属性:

public class Foo
{
    [JsonProperty("bar")]         // this will be serialized as "bar"
    public string BarName 
    {
        get { return Bar.Name; }
    }

    [JsonIgnore]                  // this won't be serialized
    public Bar Bar { get; set; }
}

请注意,如果您希望能够阅读,那么您还需要提供一个setter,并弄清楚如何将字符串名称转换回Bar的实例。这就是快速和肮脏的解决方案有点不愉快的地方,因为你没有一种简单的方法来限制在反序列化期间设置BarName