【发布时间】:2021-04-04 16:36:51
【问题描述】:
我正在使用 Newtonsoft 通过 CamelCasePropertyNamesContractResolver 合同解析器将对象序列化为 Json。
有一次(随机)Newtonsoft 在尝试解析合同时收到 NullReferenceException,然后所有其余的序列化都失败了。
我在 Linux 机器上使用 .Net core 2.1 和 Newtonsoft 版本 11.0.2。合约解析器类型是 CamelCasePropertyNamesContractResolver。
ex=System.NullReferenceException: Object reference not set to an instance of an object.
at System.Collections.Generic.Dictionary`2.TryInsert(TKey key, TValue value, InsertionBehavior behavior)
at System.Collections.Generic.Dictionary`2..ctor(IDictionary`2 dictionary, IEqualityComparer`1 comparer)
at Newtonsoft.Json.Serialization.CamelCasePropertyNamesContractResolver.ResolveContract(Type type)
at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.CalculatePropertyValues(JsonWriter writer, Object value, JsonContainerContract contract, JsonProperty member, JsonProperty property, JsonContract& memberContract, Object& memberValue)
at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeObject(JsonWriter writer, Object value, JsonObjectContract contract, JsonProperty member, JsonContainerContract collectionContract, JsonProperty containerProperty)
at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeList(JsonWriter writer, IEnumerable values, JsonArrayContract contract, JsonProperty member, JsonContainerContract collectionContract, JsonProperty containerProperty)
at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeObject(JsonWriter writer, Object value, JsonObjectContract contract, JsonProperty member, JsonContainerContract collectionContract, JsonProperty containerProperty)
at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeList(JsonWriter writer, IEnumerable values, JsonArrayContract contract, JsonProperty member, JsonContainerContract collectionContract, JsonProperty containerProperty)
at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeObject(JsonWriter writer, Object value, JsonObjectContract contract, JsonProperty member, JsonContainerContract collectionContract, JsonProperty containerProperty)
at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.Serialize(JsonWriter jsonWriter, Object value, Type objectType)
at Newtonsoft.Json.JsonSerializer.SerializeInternal(JsonWriter jsonWriter, Object value, Type objectType)
序列化对象的代码
if (serializerSettings == null)
serializerSettings = new CamelCaseSerializerSettings();
var serializer = JsonSerializer.Create(serializerSettings);
using (var streamWriter = new StreamWriter(writeTo, DEFAULT_ENCODING, 1024*2, true))
using (var jsonTextWriter = new JsonTextWriter(streamWriter))
{
jsonTextWriter.CloseOutput = false;
serializer.Serialize(jsonTextWriter, data);
}
public CamelCaseSerializerSettings(Formatting serializerFormatting = Formatting.Indented, JsonConverter converter = null)
{
Formatting = serializerFormatting;
ContractResolver = new CamelCasePropertyNamesContractResolver();
if (converter != null)
{
Converters.Add(converter);
}
}
- 为什么会出现这个错误?
- 我该如何解决?
在此处提交了有关此问题的问题:Newtonsoft Json serializer Getting NullReferenceException when using CamelCasePropertyNamesContractResolver #2507。
【问题讨论】:
-
这看起来是一个小时前的 NullReferenceException when using Newtonsoft Json serializer 的副本,该副本已作为 What is a NullReferenceException, and how do I fix it? 的副本关闭。如果您需要更具体的帮助,请将您的问题edit 分享给minimal reproducible example,特别是重现问题的 JSON 和代码(作为文本而不是屏幕截图)。
-
@Steve - NullReferenceException 正在 Newtonsoft 内部深处发生,试图构建某种
Dictionary<TKey, TValue>- 不是直接在查询者的代码中。所以,给定一个正确的minimal reproducible example,这可能需要一个单独的答案。 -
@Steve 你没有看问题!!!!这与 [什么是 NullReferenceException,我该如何解决?] (stackoverflow.com/questions/4660142/…) 问题无关,并且那里的答案没有回答我的问题。我无法重现该问题,因为它发生在随机物体上。如果我可以选择重现问题,我已经做到了,并且不在这里寻求帮助。
-
这似乎是 Newtonsoft 中的一个错误,这就是我问这个问题的原因。感谢您重新打开。
标签: c# json multithreading json.net