c# - JSON 序列化程序在自定义 JsonConverter 中序列化自定义数据类型时添加额外字符作为响应 '\'

标签 c# json serialization json.net

我正在使用自定义 JsonConverter(CustomInfoConverter) 对每个正在解析的自定义点网络类型 (CustomType) 进行一些操作。

下面是自定义 JsonConverter 的代码:

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}",
    }
  ],

}

来自 here我开始知道这可能是因为 re-json-ing, 那么,解决这个问题的方法是什么?

最佳答案

问题是这一行:

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);

关于c# - JSON 序列化程序在自定义 JsonConverter 中序列化自定义数据类型时添加额外字符作为响应 '\',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33524379/

相关文章:

c# - CorrelationManager.LogicalOperationStack 是否与 Parallel.For、Tasks、Threads 等兼容

c# - 如何从对象中获取 Xamarin.Forms 元素的名称?

javascript - 无法在 json 对象内部找到

c++ - 持久化 std::chrono time_point 实例

java - 什么是可序列化?这是什么意思?

java - Hazelcast 可移植序列化 - 处理空属性

c# - Azure 存储和条件替换/合并

c# - 如何获取应用程序使用的 DLL 的名称

asp.net-mvc - 从 ASP.NET MVC 返回包含 javascript 函数的 JSON

javascript - VueJS + Electron 创建 debian 安装程序不起作用(electron-installer-debian)