- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个要尝试序列化的测试类:
public class Testing
{
private string _name;
private string _firstname = "firstname";
public string _lastname;
private DateTime _datenow = DateTime.Now;
public DateTime _birthdate = DateTime.Now;
public string Name { get { return _name; } set { _name = value; } }
}
JsonConverter
处理测试类的序列化:
public class TestingConverter : JsonConverter
{
private Type[] _types = new Type[] { typeof(Testing)};
/// <summary>
/// Writes the JSON representation of the object.
/// </summary>
/// <param name="writer">The <see cref="JsonWriter"/> to write to.</param>
/// <param name="value">The value.</param>
/// <param name="serializer">The calling serializer.</param>
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
try
{
JToken t = JToken.FromObject(value); //This is what i want to do
//rest of code
}
catch (Exception ex)
{
Console.Write(ex.Message);
throw;
}
}
public override bool CanRead
{
get
{
return false;
}
}
}
JsonSerializer
对象来执行序列化,则可以正常工作:
Testing t = new Testing();
t._lastname = "USER LAST NAME";
JsonSerializer p = JsonSerializer.CreateDefault();
p.Converters.Add(new TestingConverter());
using (StreamWriter file = File.CreateText("output.json"))
using (JsonTextWriter writer = new JsonTextWriter(file))
{
p.Serialize(writer, t);
}
[JsonConverter]
属性标记我的测试类:
[JsonConverter(typeof(TestingConverter))]
public class Testing
{
private string _name;
private string _firstname = "firstname";
public string _lastname;
private DateTime _datenow = DateTime.Now;
public DateTime _birthdate = DateTime.Now;
public string Name { get { return _name; } set { _name = value; } }
}
Testing t = new Testing();
t._lastname = "USER LAST NAME";
JsonSerializer p = JsonSerializer.CreateDefault();
using (StreamWriter file = File.CreateText("output.json"))
using (JsonTextWriter writer = new JsonTextWriter(file))
{
p.Serialize(writer, t);
}
TestingConverter
类被调用了,但是它在
JToken.FromObject(value)
方法处进入了递归循环,最后以
StackOverflowException
崩溃。
最佳答案
当您将转换器的一个实例传递给序列化器时,只有该序列化器的实例才知道该转换器。在转换器内部,当您调用JToken.FromObject(value)
时,它将使用其他序列化程序实例将值转换为JToken
。该实例不知道您的转换器,因此按预期使用Json.Net的默认序列化逻辑。一切都很好。
另一方面,如果您在类型上放置[JsonConverter]
属性以指示该类型已由您的转换器处理,那么现在所有序列化器实例都知道您的转换器。转换器内部对JToken.FromObject(value)
的调用将启动一个新的序列化器实例;该实例看到它应该使用您的转换器来处理此对象类型,因此它以递归方式调用您的转换器。重复此过程,直到堆栈空间用完为止。
如果要使用[JsonConverter]
属性,则需要更改转换器的内部,以避免递归调用链。通常,这涉及手动处理类型的所有单个属性。例如,以下版本将与应用的属性一起使用:
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
Testing t = (Testing)value;
JObject jo = new JObject();
jo.Add("name", t.Name);
jo.Add("lastname", t._lastname);
jo.Add("birthdate", t._birthdate);
jo.WriteTo(writer);
}
关于.net - 使用[JsonConverter]属性时,我的JsonConverter类中的StackOverflowException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22407321/
编辑:澄清问题: 我已经覆盖了基类型的 JsonConverter(通过将 [JsonConverter(typeof(TConverter))] 应用于父类(super class)),但是当直接反
尝试使用 JsonConvert.PopulateObject 更新类属性时,未调用 JsonPathConverter,因此未完成填充。 示例类: [JsonConverter(typeof(Jso
我有一个我不能改变的类: public enum MyEnum { Item1 = 0, Item2 = 1 } public class foo { [JsonConvert
我正在使用 Json.NET (6.0.3) 进行序列化。我编写了一个自定义 JsonConverter TestConverter 来处理一些 BaseClass 的实例(通过将它们转换为整数 id
我有一个要求,我需要将默认值设置为下面的复杂属性 Instances使用 JsonProperty和 DefaultValue . 我知道我们可以为以下链接中提到的原始属性实现这一点,但需要知道我们如
我尝试查找上述比较,但找不到答案。 因为有多种方法可以获取 JObject(或所有继承自 JToken 的子类型)例如: Method1 . JObject.FromObject(obj); Meth
我已启用我的 API 以使用字符串值序列化/反序列化枚举。为此,我已将 JsonStringEnumConverter 添加到 API 的 Startup 类中受支持的 JsonConverter 列
我有一个 Employee 类,其中 Manager 属性本身是 Employee 类型 public class Employee { public string FirstName { g
我已经卡住模型(简化): part 'initial_data_model.freezed.dart'; part 'initial_data_model.g.dart'; @freezed clas
我正在尝试将两个字段和一个包含两个字段的捆绑对象发布到 Mailchimp 的 API 端点。 var store_id = ConfigurationManager.AppS
以下VB.NET代码使用Newtonsoft JSON.NET库,并在按钮单击事件处理程序中执行并阻止UI线程: Dim table As DataTable = Await Task.Factory
我遇到了一个问题,其中以下 ToJson() 方法返回的字符串仅为“{}” public class GenericRequest { publ
这个问题在这里已经有了答案: JSON Can't be Deserialized to Object, Needs Array? (2 个答案) 关闭 9 年前。 我有这个 Json 返回: [
我遇到了一个问题,其中以下 ToJson() 方法返回的字符串仅为“{}” public class GenericRequest { publ
这个问题在这里已经有了答案: JSON Can't be Deserialized to Object, Needs Array? (2 个答案) 关闭 9 年前。 我有这个 Json 返回: [
我创建了一个简单的类: public class TestObject { public TestObject(int id, string name, List list) {
我有一个像这样的 Json 对象: {"company": "My Company", "companyStart" : "2015/01/01", "employee" : { "name"
这是 json: { "odata.metadata": ".....", "value": [ { "AbsEntry": 10,
我有一个对象,其中包含一个具有 JsonConverter 属性的属性。对于数据读写,转换器不工作。声明的属性是 [JsonConverter(typeof(EpochDateTimeConverte
编辑:制作了一个更简单、更透明的示例案例 我正在尝试反序列化一组组件(属于一个实体)。其中一个组件是 Sprite 组件,它包含纹理和动画信息。我为此实现了一个 CustomConverter,因为原
我是一名优秀的程序员,十分优秀!