C# JSON序列化程序添加额外字符作为'\';在自定义JsonConverter中序列化自定义数据类型时响应
我正在使用自定义JsonConverter(CustomInfoConverter)对正在获取解析的每个自定义点网类型(CustomType)进行一些操作 以下是自定义JsonConverter的代码:C# JSON序列化程序添加额外字符作为'\';在自定义JsonConverter中序列化自定义数据类型时响应,c#,json,serialization,json.net,C#,Json,Serialization,Json.net,我正在使用自定义JsonConverter(CustomInfoConverter)对正在获取解析的每个自定义点网类型(CustomType)进行一些操作 以下是自定义JsonConverter的代码: public class CustomInfoConverter : JsonConverter { public override bool CanConvert(Type objectType) { return objectType == typeof(C
public class CustomInfoConverter : JsonConverter
{
public override bool CanConvert(Type objectType)
{
return objectType == typeof(CustomType);
}
public override bool CanRead
{
get
{
return false;
}
}
public override bool CanWrite
{
get
{
return true;
}
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
var customType = (CustomType)value;
if (customType == null || null== customType.TimeZone) return;
//DateTime currentDateTime = customType.Date??DateTime.Now;
DateTime currentDateTime = DateTime.SpecifyKind(customType.Date ?? DateTime.Now, DateTimeKind.Unspecified);
DateTime userDateTime = TimeZoneInfo.ConvertTimeFromUtc(currentDateTime, customType.TimeZone);
customType.Date = userDateTime;
writer.WriteValue(JsonConvert.SerializeObject(customType) );
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
throw new NotImplementedException();
}
}
我在这里面临的问题是附加了额外的字符“\”,因此我的响应看起来像是JsonConvert.SerializeObject(customType)
正在序列化customType对象,而默认序列化程序正在序列化它(如果我错了,请纠正我)。解决这个问题的办法是什么
{
"Data": [
{
"Type": "someThing",
"Created": "{\"Date\":\"2015-11-05T01:09:21.6721171+05:30\",\"User\":{\"Upn\":\"james\",\"FirstName\":\"James\",\"LastName\":\"Johnson\",\"Id\":\"69cb471e-da83-48c3-8f60-d1bb29d41177\",\"Name\":\"Johnson\"},\"TimeZone\":{\"Id\":\"India Standard Time\",\"DisplayName\":\"(UTC+05:30) Chennai, Kolkata, Mumbai, New Delhi\",\"StandardName\":\"India Standard Time\",\"DaylightName\":\"India Daylight Time\",\"BaseUtcOffset\":\"05:30:00\",\"AdjustmentRules\":null,\"SupportsDaylightSavingTime\":false},\"Latitude\":null,\"Longitude\":null}",
}
],
}
从那以后我才知道可能是因为重新开始,
那么,这个问题的解决方案是什么呢?问题是这一行:
{
"Data": [
{
"Type": "someThing",
"Created": "{\"Date\":\"2015-11-05T01:09:21.6721171+05:30\",\"User\":{\"Upn\":\"james\",\"FirstName\":\"James\",\"LastName\":\"Johnson\",\"Id\":\"69cb471e-da83-48c3-8f60-d1bb29d41177\",\"Name\":\"Johnson\"},\"TimeZone\":{\"Id\":\"India Standard Time\",\"DisplayName\":\"(UTC+05:30) Chennai, Kolkata, Mumbai, New Delhi\",\"StandardName\":\"India Standard Time\",\"DaylightName\":\"India Daylight Time\",\"BaseUtcOffset\":\"05:30:00\",\"AdjustmentRules\":null,\"SupportsDaylightSavingTime\":false},\"Latitude\":null,\"Longitude\":null}",
}
],
}
writer.WriteValue(JsonConvert.SerializeObject(customType));
相反,您应该这样做以避免双重序列化:
serializer.Serialize(writer, customType);
但是,由于您试图序列化转换器转换的同一对象,因此上述操作将导致自引用循环。在这种情况下,您需要使用序列化程序的新实例。请尝试以下方法:
new JsonSerializer().Serialize(writer, customType);
注意:如果您正在使用任何其他转换器(或自定义设置),则新序列化程序实例将不知道这些转换器,除非您专门从外部序列化程序复制它们。如果需要执行此操作,请确保不要将CustomInfoConverter
复制到新实例,否则将再次出现自引用循环问题。要复制转换器,请将上述内容替换为以下内容:
JsonSerializer innerSerializer = new JsonSerializer();
foreach (var converter in serializer.Converters.Where(c => !(c is CustomInfoConverter)))
{
innerSerializer.Converters.Add(converter);
}
innerSerializer.Serialize(writer, customType);
你能为json提供额外的“\”吗?你的字符串看起来很好,除了结尾缺少“是因为你输入错误还是这正是你的json(那根本不起作用)?编辑了带有完整json响应的问题在这种情况下,我面临以下运行时异常在Newtonsoft.json.json SerializationException类型的异常发生在Newtonsoft.json.dll中,但未在用户代码中处理其他信息:使用类型“customType.Path”数据检测到自引用循环[0]“.啊,是的。问题是你正在序列化你的转换器转换的同一个对象。这将导致一个递归循环——转换器调用序列化程序,然后调用转换器,然后调用序列化程序,等等。你可以通过使用序列化程序的新实例来解决这个问题。我已经编辑了我的答案。谢谢@Brain,它正在工作,但它导致了一个问题。我有另一个JsonConverter,名为TimeZoneInfo Converter,它正在将时区转换为其首字母(“印度标准时间”转换为“IST”),在使用此代码而不是得到“IST”响应后,我得到了“印度标准时间”“。这可能是因为未触发TimeZoneInfo转换器,因为customType的一个属性的类型为TimeZoneInfo。还有其他可能的原因吗?我在JsonContentNegotiator中注册了TimeZoneInfo Converter之后的CustomInfoConverter,也尝试了反过来,但没有成功:(啊。你没有提到你在使用其他转换器。问题是我们在这里创建的新JsonSerializer实例不了解其他转换器。因此,你需要将它们从外部序列化器复制到新实例。但是,你需要确保不要将
CustomInfoConverter
复制到新的序列化程序,否则您将返回到自引用循环问题。我将在几分钟内更新我的答案。非常好;很高兴听到这个消息。