将Json从流反序列化为字符串属性

时间:2015-12-30 23:01:14

标签: c# serialization json.net

为了重用使用Newtonsoft Json.NET的现有代码,我需要能够将流的整个json内容反序列化为“BadData”对象的单个属性。

示例:

public class BadDataEntity
{
  [Key]
  public int ID { get; set; }

  public string BadData { get; set; }
}

我可以添加到这个类的属性组合,所以当我反序列化任何Json时,它作为字符串完成了BadData属性吗?

感谢。

1 个答案:

答案 0 :(得分:0)

如果由于某种原因,必须使用Json.NET解析此类(而不是简单地将流读入字符串然后从中手动构建类),您可以创建{{3}将JSON加载到custom JsonConverter然后将其字符串值存储到BadDataEntity类中:

public class BadDataEntityConverter : JsonConverter
{
    public override bool CanConvert(Type objectType)
    {
        return typeof(BadDataEntity).IsAssignableFrom(objectType);
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        // Note that BadData MUST BE VALID JSON, otherwise this won't work.
        var token = JToken.Load(reader);
        var bad = (existingValue as BadDataEntity ?? new BadDataEntity());
        bad.BadData = JsonConvert.SerializeObject(token, Formatting.Indented);
        return bad;
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        var bad = (BadDataEntity)value;
        if (bad.BadData == null)
            writer.WriteNull();
        else
        {
            var token = JToken.Parse(bad.BadData);
            token.WriteTo(writer, serializer.Converters.ToArray());
        }
    }
}

请注意,该字符串必须包含有效的JSON。

然后您可以将转换器附加到您的班级,如下所示:

[JsonConverter(typeof(BadDataEntityConverter))]
public class BadDataEntity
{
    [Key]
    public int ID { get; set; }

    public string BadData { get; set; }
}

或者将其放在JToken列表中,如convertersdocumentation中所示。