Gremlinq / ExRam.Gremlinq

A .NET object-graph-mapper for Apache TinkerPop™ Gremlin enabled databases.

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

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.

https://docs.microsoft.com/en-us/dotnet/standard/serialization/system-text-json-converters-how-to?pivots=dotnet-core-3-1

and you will use it something like this:

https://docs.microsoft.com/en-us/dotnet/standard/serialization/system-text-json-converters-how-to?pivots=dotnet-core-3-1#registration-sample---converters-collection

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.

commented

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.