Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# JSON序列化程序添加额外字符作为'\';在自定义JsonConverter中序列化自定义数据类型时响应_C#_Json_Serialization_Json.net - Fatal编程技术网

C# JSON序列化程序添加额外字符作为'\';在自定义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

我正在使用自定义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}",
    }
  ],

}
从那以后我才知道可能是因为重新开始,
那么,这个问题的解决方案是什么呢?

问题是这一行:

   {
  "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
复制到新的序列化程序,否则您将返回到自引用循环问题。我将在几分钟内更新我的答案。非常好;很高兴听到这个消息。