ReadJson和WriteJson与Divan couchdb一起使用,但不与Newtonsoft的Json.Net一起使用

时间:2015-01-16 15:43:46

标签: c# .net vb.net json.net couchdb

我有一个包含DateTime属性的类,我将其写入couch作为WriteJson覆盖中的数组,并从JsonRead覆盖中的数组中读取,在使用Divan从沙发保存/加载时工作正常。

我的问题是我使用http将Newtonsoft.Json序列化字符串传递给我的应用程序的另一个实例(在单独的机器上运行)但是Newtonsoft不会触发我的覆盖以进行读/写。

相反,Newtonsoft试图从字符串而不是数组解析json属性(我认为Newtonsoft的JsonConverter的默认行为?)我无法改变它的工作方式,因为它需要能够与文档集成来自旧系统。

如何让Json.net为ReadJson和WriteJson调用我的覆盖?

public class JobResults : CouchDocument, ICanJson
{
    [JsonProperty("update-datetime")]
    public DateTime UpdateDateTime = new DateTime(1, 1, 1, 0, 0, 0);

    [JsonProperty("job-ids")]
    public JArray JobIDs = new JArray();


    #region CouchDocument Members

        public override void WriteJson(JsonWriter writer)
        {
            base.WriteJson(writer);

            writer.WritePropertyName("update-datetime");
            writer.WriteStartArray();
            writer.WriteValue(UpdateDateTime.Year);
            writer.WriteValue(UpdateDateTime.Month);
            writer.WriteValue(UpdateDateTime.Day);
            writer.WriteValue(UpdateDateTime.Hour);
            writer.WriteValue(UpdateDateTime.Minute);
            writer.WriteValue(UpdateDateTime.Second);
            writer.WriteEndArray();

            writer.WritePropertyName("job-ids");
            writer.WriteStartArray();
            foreach (string i in JobIDs)
                writer.WriteValue(i);
            writer.WriteEndArray();
        }

        public override void ReadJson(JObject obj)
        {
            base.ReadJson(obj);

            var dt = obj["update-datetime"].Value<JArray>();
            UpdateDateTime = new DateTime((int)dt[0], (int)dt[1], (int)dt[2], (int)dt[3], (int)dt[4], (int)dt[5]);
            JobIDs = obj["job-ids"].Value<JArray>();
        }

        #endregion
}

1 个答案:

答案 0 :(得分:1)

没关系,我得到了它,我添加了JsonConverter属性并将其指向另一个类。

[JsonConverter(typeof(Serializer))]
public class JobResults : CouchDocument, ICanJson
{
    [JsonProperty("update-datetime")]
    public DateTime UpdateDateTime = new DateTime(1, 1, 1, 0, 0, 0);

    [JsonProperty("job-ids")]
    public JArray JobIDs = new JArray();
    ...
}

public class Serializer : JsonConverter
{
    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        ...
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        ...
    }

    public override bool CanConvert(Type objectType)
    {
        return typeof(JobResults).IsAssignableFrom(objectType);
    }
}