Getting error with enum property with JsonConverter attribute
jbockle opened this issue · comments
Describe the bug
My vertex has an enum property - if I add the newtonsoft.json [JsonConverter(typeof(StringEnumConverter)]
attribute to the enum, gremlinq throws the below error during when deserializing:
Newtonsoft.Json.JsonSerializationException: Unexpected token StartArray when parsing enum. Path '[0].properties.Kind'.
at Newtonsoft.Json.Converters.StringEnumConverter.ReadJson(JsonReader reader, Type objectType, Object existingValue, JsonSerializer serializer)
at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.DeserializeConvertable(JsonConverter converter, JsonReader reader, Type objectType, Object existingValue)
at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.SetPropertyValue(JsonProperty property, JsonConverter propertyConverter, JsonContainerContract containerContract, JsonProperty containerProperty, JsonReader reader, Object target)
at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.PopulateObject(Object newObject, JsonReader reader, JsonObjectContract contract, JsonProperty member, String id)
at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.Populate(JsonReader reader, Object target)
at Newtonsoft.Json.JsonSerializer.PopulateInternal(JsonReader reader, Object target)
at Newtonsoft.Json.JsonSerializer.Populate(JsonReader reader, Object target)
at ExRam.Gremlinq.Core.Deserialization.GremlinQueryFragmentDeserializer.<>c.<AddNewtonsoftJson>b__3_0(JToken jToken, Type type, IGremlinQueryEnvironment env, BaseGremlinQueryFragmentDeserializerDelegate`1 overridden, IGremlinQueryFragmentDeserializer recurse) in /_/src/ExRam.Gremlinq.Core/Deserialization/GremlinQueryFragmentDeserializer.cs:line 149
at ExRam.Gremlinq.Core.Deserialization.GremlinQueryFragmentDeserializer.GremlinQueryFragmentDeserializerImpl.<>c__DisplayClass8_0`1.<Override>b__0(TSerialized fragment, Type type, IGremlinQueryEnvironment env, BaseGremlinQueryFragmentDeserializerDelegate`1 _, IGremlinQueryFragmentDeserializer recurse) in /_/src/ExRam.Gremlinq.Core/Deserialization/GremlinQueryFragmentDeserializer.cs:line 48
at ExRam.Gremlinq.Core.Deserialization.GremlinQueryFragmentDeserializer.GremlinQueryFragmentDeserializerImpl.<>c__DisplayClass11_0`2.<CreateFunc1>b__0(TStatic serialized, Type fragmentType, IGremlinQueryEnvironment environment, IGremlinQueryFragmentDeserializer recurse) in /_/src/ExRam.Gremlinq.Core/Deserialization/GremlinQueryFragmentDeserializer.cs:line 96
at ExRam.Gremlinq.Core.Deserialization.GremlinQueryFragmentDeserializer.<>c.<AddNewtonsoftJson>b__3_1(JToken jToken, Type type, IGremlinQueryEnvironment env, BaseGremlinQueryFragmentDeserializerDelegate`1 overridden, IGremlinQueryFragmentDeserializer recurse) in /_/src/ExRam.Gremlinq.Core/Deserialization/GremlinQueryFragmentDeserializer.cs:line 170
at ExRam.Gremlinq.Core.Deserialization.GremlinQueryFragmentDeserializer.GremlinQueryFragmentDeserializerImpl.<>c__DisplayClass8_0`1.<Override>b__0(TSerialized fragment, Type type, IGremlinQueryEnvironment env, BaseGremlinQueryFragmentDeserializerDelegate`1 _, IGremlinQueryFragmentDeserializer recurse) in /_/src/ExRam.Gremlinq.Core/Deserialization/GremlinQueryFragmentDeserializer.cs:line 48
at ExRam.Gremlinq.Core.Deserialization.GremlinQueryFragmentDeserializer.GremlinQueryFragmentDeserializerImpl.<>c__DisplayClass11_0`2.<CreateFunc1>b__0(TStatic serialized, Type fragmentType, IGremlinQueryEnvironment environment, IGremlinQueryFragmentDeserializer recurse) in /_/src/ExRam.Gremlinq.Core/Deserialization/GremlinQueryFragmentDeserializer.cs:line 96
at ExRam.Gremlinq.Core.Deserialization.GremlinQueryFragmentDeserializer.<>c.<AddNewtonsoftJson>b__3_2(JToken jToken, Type type, IGremlinQueryEnvironment env, BaseGremlinQueryFragmentDeserializerDelegate`1 overridden, IGremlinQueryFragmentDeserializer recurse) in /_/src/ExRam.Gremlinq.Core/Deserialization/GremlinQueryFragmentDeserializer.cs:line 174
at ExRam.Gremlinq.Core.Deserialization.GremlinQueryFragmentDeserializer.GremlinQueryFragmentDeserializerImpl.<>c__DisplayClass8_0`1.<Override>b__0(TSerialized fragment, Type type, IGremlinQueryEnvironment env, BaseGremlinQueryFragmentDeserializerDelegate`1 _, IGremlinQueryFragmentDeserializer recurse) in /_/src/ExRam.Gremlinq.Core/Deserialization/GremlinQueryFragmentDeserializer.cs:line 48
at ExRam.Gremlinq.Core.Deserialization.GremlinQueryFragmentDeserializer.GremlinQueryFragmentDeserializerImpl.<>c__DisplayClass11_0`2.<CreateFunc1>b__0(TStatic serialized, Type fragmentType, IGremlinQueryEnvironment environment, IGremlinQueryFragmentDeserializer recurse) in /_/src/ExRam.Gremlinq.Core/Deserialization/GremlinQueryFragmentDeserializer.cs:line 96
at ExRam.Gremlinq.Core.Deserialization.GremlinQueryFragmentDeserializer.<>c__DisplayClass4_0`2.<Override>b__0(TSerialized token, Type type, IGremlinQueryEnvironment env, BaseGremlinQueryFragmentDeserializerDelegate`1 overridden, IGremlinQueryFragmentDeserializer recurse) in /_/src/ExRam.Gremlinq.Core/Deserialization/GremlinQueryFragmentDeserializer.cs:line 403
at ExRam.Gremlinq.Core.Deserialization.GremlinQueryFragmentDeserializer.GremlinQueryFragmentDeserializerImpl.<>c__DisplayClass8_0`1.<Override>b__0(TSerialized fragment, Type type, IGremlinQueryEnvironment env, BaseGremlinQueryFragmentDeserializerDelegate`1 _, IGremlinQueryFragmentDeserializer recurse) in /_/src/ExRam.Gremlinq.Core/Deserialization/GremlinQueryFragmentDeserializer.cs:line 48
at ExRam.Gremlinq.Core.Deserialization.GremlinQueryFragmentDeserializer.GremlinQueryFragmentDeserializerImpl.<>c__DisplayClass11_0`2.<CreateFunc1>b__0(TStatic serialized, Type fragmentType, IGremlinQueryEnvironment environment, IGremlinQueryFragmentDeserializer recurse) in /_/src/ExRam.Gremlinq.Core/Deserialization/GremlinQueryFragmentDeserializer.cs:line 96
at ExRam.Gremlinq.Core.Deserialization.GremlinQueryFragmentDeserializer.<>c.<AddNewtonsoftJson>b__3_11(JObject jObject, Type type, IGremlinQueryEnvironment env, BaseGremlinQueryFragmentDeserializerDelegate`1 overridden, IGremlinQueryFragmentDeserializer recurse) in /_/src/ExRam.Gremlinq.Core/Deserialization/GremlinQueryFragmentDeserializer.cs:line 277
at ExRam.Gremlinq.Core.Deserialization.GremlinQueryFragmentDeserializer.GremlinQueryFragmentDeserializerImpl.<>c__DisplayClass8_0`1.<Override>b__0(TSerialized fragment, Type type, IGremlinQueryEnvironment env, BaseGremlinQueryFragmentDeserializerDelegate`1 _, IGremlinQueryFragmentDeserializer recurse) in /_/src/ExRam.Gremlinq.Core/Deserialization/GremlinQueryFragmentDeserializer.cs:line 48
at ExRam.Gremlinq.Core.Deserialization.GremlinQueryFragmentDeserializer.GremlinQueryFragmentDeserializerImpl.<>c__DisplayClass11_0`2.<CreateFunc1>b__0(TStatic serialized, Type fragmentType, IGremlinQueryEnvironment environment, IGremlinQueryFragmentDeserializer recurse) in /_/src/ExRam.Gremlinq.Core/Deserialization/GremlinQueryFragmentDeserializer.cs:line 96
at ExRam.Gremlinq.Core.Deserialization.GremlinQueryFragmentDeserializer.<>c.<AddNewtonsoftJson>b__3_12(JObject jObject, Type type, IGremlinQueryEnvironment env, BaseGremlinQueryFragmentDeserializerDelegate`1 overridden, IGremlinQueryFragmentDeserializer recurse) in /_/src/ExRam.Gremlinq.Core/Deserialization/GremlinQueryFragmentDeserializer.cs:line 290
at ExRam.Gremlinq.Core.Deserialization.GremlinQueryFragmentDeserializer.GremlinQueryFragmentDeserializerImpl.<>c__DisplayClass8_0`1.<Override>b__0(TSerialized fragment, Type type, IGremlinQueryEnvironment env, BaseGremlinQueryFragmentDeserializerDelegate`1 _, IGremlinQueryFragmentDeserializer recurse) in /_/src/ExRam.Gremlinq.Core/Deserialization/GremlinQueryFragmentDeserializer.cs:line 48
at ExRam.Gremlinq.Core.Deserialization.GremlinQueryFragmentDeserializer.GremlinQueryFragmentDeserializerImpl.<>c__DisplayClass11_0`2.<CreateFunc1>b__0(TStatic serialized, Type fragmentType, IGremlinQueryEnvironment environment, IGremlinQueryFragmentDeserializer recurse) in /_/src/ExRam.Gremlinq.Core/Deserialization/GremlinQueryFragmentDeserializer.cs:line 96
at ExRam.Gremlinq.Core.Deserialization.GremlinQueryFragmentDeserializer.<>c.<AddNewtonsoftJson>b__3_13(JObject jObject, Type type, IGremlinQueryEnvironment env, BaseGremlinQueryFragmentDeserializerDelegate`1 overridden, IGremlinQueryFragmentDeserializer recurse) in /_/src/ExRam.Gremlinq.Core/Deserialization/GremlinQueryFragmentDeserializer.cs:line 294
at ExRam.Gremlinq.Core.Deserialization.GremlinQueryFragmentDeserializer.GremlinQueryFragmentDeserializerImpl.<>c__DisplayClass8_0`1.<Override>b__0(TSerialized fragment, Type type, IGremlinQueryEnvironment env, BaseGremlinQueryFragmentDeserializerDelegate`1 _, IGremlinQueryFragmentDeserializer recurse) in /_/src/ExRam.Gremlinq.Core/Deserialization/GremlinQueryFragmentDeserializer.cs:line 48
at ExRam.Gremlinq.Core.Deserialization.GremlinQueryFragmentDeserializer.GremlinQueryFragmentDeserializerImpl.<>c__DisplayClass11_0`2.<CreateFunc1>b__0(TStatic serialized, Type fragmentType, IGremlinQueryEnvironment environment, IGremlinQueryFragmentDeserializer recurse) in /_/src/ExRam.Gremlinq.Core/Deserialization/GremlinQueryFragmentDeserializer.cs:line 96
at ExRam.Gremlinq.Core.Deserialization.GremlinQueryFragmentDeserializer.<>c.<AddNewtonsoftJson>b__3_14(JObject jObject, Type type, IGremlinQueryEnvironment env, BaseGremlinQueryFragmentDeserializerDelegate`1 overridden, IGremlinQueryFragmentDeserializer recurse) in /_/src/ExRam.Gremlinq.Core/Deserialization/GremlinQueryFragmentDeserializer.cs:line 301
at ExRam.Gremlinq.Core.Deserialization.GremlinQueryFragmentDeserializer.GremlinQueryFragmentDeserializerImpl.<>c__DisplayClass8_0`1.<Override>b__0(TSerialized fragment, Type type, IGremlinQueryEnvironment env, BaseGremlinQueryFragmentDeserializerDelegate`1 _, IGremlinQueryFragmentDeserializer recurse) in /_/src/ExRam.Gremlinq.Core/Deserialization/GremlinQueryFragmentDeserializer.cs:line 48
at ExRam.Gremlinq.Core.Deserialization.GremlinQueryFragmentDeserializer.GremlinQueryFragmentDeserializerImpl.<>c__DisplayClass11_0`2.<CreateFunc1>b__0(TStatic serialized, Type fragmentType, IGremlinQueryEnvironment environment, IGremlinQueryFragmentDeserializer recurse) in /_/src/ExRam.Gremlinq.Core/Deserialization/GremlinQueryFragmentDeserializer.cs:line 96
at ExRam.Gremlinq.Core.Deserialization.GremlinQueryFragmentDeserializer.<>c.<AddNewtonsoftJson>b__3_15(JObject jObject, Type type, IGremlinQueryEnvironment env, BaseGremlinQueryFragmentDeserializerDelegate`1 overridden, IGremlinQueryFragmentDeserializer recurse) in /_/src/ExRam.Gremlinq.Core/Deserialization/GremlinQueryFragmentDeserializer.cs:line 333
at ExRam.Gremlinq.Core.Deserialization.GremlinQueryFragmentDeserializer.GremlinQueryFragmentDeserializerImpl.<>c__DisplayClass8_0`1.<Override>b__0(TSerialized fragment, Type type, IGremlinQueryEnvironment env, BaseGremlinQueryFragmentDeserializerDelegate`1 _, IGremlinQueryFragmentDeserializer recurse) in /_/src/ExRam.Gremlinq.Core/Deserialization/GremlinQueryFragmentDeserializer.cs:line 48
at ExRam.Gremlinq.Core.Deserialization.GremlinQueryFragmentDeserializer.GremlinQueryFragmentDeserializerImpl.<>c__DisplayClass11_0`2.<CreateFunc1>b__0(TStatic serialized, Type fragmentType, IGremlinQueryEnvironment environment, IGremlinQueryFragmentDeserializer recurse) in /_/src/ExRam.Gremlinq.Core/Deserialization/GremlinQueryFragmentDeserializer.cs:line 96
at ExRam.Gremlinq.Core.Deserialization.GremlinQueryFragmentDeserializer.GremlinQueryFragmentDeserializerImpl.<>c__DisplayClass13_0`2.<CreateFunc3>b__0(TSerialized serialized, Type fragmentType, IGremlinQueryEnvironment environment, IGremlinQueryFragmentDeserializer recurse) in /_/src/ExRam.Gremlinq.Core/Deserialization/GremlinQueryFragmentDeserializer.cs:line 106
at ExRam.Gremlinq.Core.Deserialization.GremlinQueryFragmentDeserializer.GremlinQueryFragmentDeserializerImpl.TryDeserialize[TSerialized](TSerialized serializedData, Type fragmentType, IGremlinQueryEnvironment environment) in /_/src/ExRam.Gremlinq.Core/Deserialization/GremlinQueryFragmentDeserializer.cs:line 37
at ExRam.Gremlinq.Core.Deserialization.GremlinQueryFragmentDeserializer.<>c.<AddNewtonsoftJson>b__3_18(JArray jArray, Type type, IGremlinQueryEnvironment env, BaseGremlinQueryFragmentDeserializerDelegate`1 overridden, IGremlinQueryFragmentDeserializer recurse) in /_/src/ExRam.Gremlinq.Core/Deserialization/GremlinQueryFragmentDeserializer.cs:line 377
at ExRam.Gremlinq.Core.Deserialization.GremlinQueryFragmentDeserializer.GremlinQueryFragmentDeserializerImpl.<>c__DisplayClass8_0`1.<Override>b__0(TSerialized fragment, Type type, IGremlinQueryEnvironment env, BaseGremlinQueryFragmentDeserializerDelegate`1 _, IGremlinQueryFragmentDeserializer recurse) in /_/src/ExRam.Gremlinq.Core/Deserialization/GremlinQueryFragmentDeserializer.cs:line 48
at ExRam.Gremlinq.Core.Deserialization.GremlinQueryFragmentDeserializer.GremlinQueryFragmentDeserializerImpl.<>c__DisplayClass11_0`2.<CreateFunc1>b__0(TStatic serialized, Type fragmentType, IGremlinQueryEnvironment environment, IGremlinQueryFragmentDeserializer recurse) in /_/src/ExRam.Gremlinq.Core/Deserialization/GremlinQueryFragmentDeserializer.cs:line 96
at ExRam.Gremlinq.Core.Deserialization.GremlinQueryFragmentDeserializer.GremlinQueryFragmentDeserializerImpl.<>c__DisplayClass13_0`2.<CreateFunc3>b__0(TSerialized serialized, Type fragmentType, IGremlinQueryEnvironment environment, IGremlinQueryFragmentDeserializer recurse) in /_/src/ExRam.Gremlinq.Core/Deserialization/GremlinQueryFragmentDeserializer.cs:line 106
at ExRam.Gremlinq.Core.Deserialization.GremlinQueryFragmentDeserializer.GremlinQueryFragmentDeserializerImpl.TryDeserialize[TSerialized](TSerialized serializedData, Type fragmentType, IGremlinQueryEnvironment environment) in /_/src/ExRam.Gremlinq.Core/Deserialization/GremlinQueryFragmentDeserializer.cs:line 37
at ExRam.Gremlinq.Core.Deserialization.GremlinQueryExecutionResultDeserializer.GremlinQueryExecutionResultDeserializerImpl.Deserialize[TElement](Object executionResult, IGremlinQueryEnvironment environment) in /_/src/ExRam.Gremlinq.Core/Deserialization/GremlinQueryExecutionResultDeserializer.cs:line 21
at ExRam.Gremlinq.Core.GremlinQuery`6.<ExRam.Gremlinq.Core.IGremlinQueryBase<TElement>.ToAsyncEnumerable>b__209_0(Object executionResult) in /_/src/ExRam.Gremlinq.Core/Queries/GremlinQuery.explicit.cs:line 220
at System.Linq.AsyncEnumerable.SelectManyAsyncIterator`2.ToListAsync(CancellationToken cancellationToken) in /_/Ix.NET/Source/System.Linq.Async/System/Linq/Operators/SelectMany.cs:line 434
at System.Linq.AsyncEnumerable.SelectManyAsyncIterator`2.ToListAsync(CancellationToken cancellationToken) in /_/Ix.NET/Source/System.Linq.Async/System/Linq/Operators/SelectMany.cs:line 432
at System.Linq.AsyncEnumerable.SelectManyAsyncIterator`2.ToArrayAsync(CancellationToken cancellationToken) in /_/Ix.NET/Source/System.Linq.Async/System/Linq/Operators/SelectMany.cs:line 423
Expected behavior
Deserialization should not fail
Version information
10.0.0-preview.341
Minimal working example
I'll open a PR with a failing unit test
@jbockle Maybe you need a custom converter. So that when deserializing/serializing it knows how to translate your enum into some type.
and you will use it something like this:
var serializeOptions = new JsonSerializerOptions
{
WriteIndented = true,
Converters =
{
new DateTimeOffsetJsonConverter()
}
};
jsonString = JsonSerializer.Serialize(weatherForecast, serializeOptions);
This library uses json.net and I'm using a json.net converter, not a system.text.json converter on my enum like below. I want to prevent potential breaking changes in my enum if I add new values that may change the integer value.
[JsonConverter(typeof(StringEnumConverter)]
public enum MyEnum {
Foo,
Bar
}
public class MyVertex {
public string? Id {get;set;}
public MyEnum EnumValue {get;set;}
}
JsonConverter attributes will generally not work for Gremlinq. If you suspect some buggy behaviour/missing feature in the Gremlinq library, please post a link to a minimal reproducible repository, as asked for in the issue template. Thx.
Hello @jbockle,
thanks for your interest in ExRam.Gremlinq. The issue was labelled "Repro repository missing" because although the issue template asks for either "a link to GitHub repository containing a minimal executable project structure that exposes the unexpected behaviour" or "a pull request to ExRam.Gremlinq that adds a failing unit test to the ExRam.Gremlinq tests asserting the expected behaviour", it seems you provided neither. Most problems already solve themselves when isolated and if they don't, you will have made it easier for the maintainer of this project to investigate a possible bug.
This issue has been automatically marked as stale because it has not had recent activity. It will be closed if no further activity occurs. Thank you for your contributions.