ReadJson 和 WriteJson 适用于 Divan couchdb 但不适用于 Newtonsoft 的 Json.Net
ReadJson and WriteJson works with Divan couchdb but not with Newtonsoft's Json.Net
我有一个 class,其中包含一个 DateTime 属性,我将其作为 WriteJson 覆盖中的数组写入沙发,并从 JsonRead 覆盖中的数组读取,这在保存时工作正常 in/loading 和 Divan 坐在沙发上。
我的问题是我使用 http 将 Newtonsoft.Json 序列化字符串传递给我的应用程序的另一个实例(运行 在单独的机器上),但 Newtonsoft 不会触发我对 [=21 的覆盖=].
相反,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
}
没关系,我知道了,我添加了 JsonConverter 属性并将其指向不同的 class。
[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);
}
}
我有一个 class,其中包含一个 DateTime 属性,我将其作为 WriteJson 覆盖中的数组写入沙发,并从 JsonRead 覆盖中的数组读取,这在保存时工作正常 in/loading 和 Divan 坐在沙发上。
我的问题是我使用 http 将 Newtonsoft.Json 序列化字符串传递给我的应用程序的另一个实例(运行 在单独的机器上),但 Newtonsoft 不会触发我对 [=21 的覆盖=].
相反,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
}
没关系,我知道了,我添加了 JsonConverter 属性并将其指向不同的 class。
[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);
}
}