Intechnity-com / OdooJsonRpcClient

Odoo Client Json Rpc
MIT License
67 stars 29 forks source link

"Not implemented json mapping value" for numerical Enum #54

Open manitra opened 1 year ago

manitra commented 1 year ago

I receive an exception when trying to read the Access rights of some Odoo Users (res.users) : Not implemented json mapping value: '$\"sel_groups_9_18_10\": 10' to Nullable

After careful check, it looks like the mapping are correct : there is a .NET property with the correct JsonProperty attribute and the Enum has the corresponding value 10. I tried both with Nullable property and non Nullable and it both fails.

Note that those Enum mapping work perfectly on dozens of other fields.

The .NET property

[JsonProperty("sel_groups_9_18_10")]
public SalesResUsersOdoo11Enum? SelGroups91810 { get; set; }

The .NET enum

[JsonConverter(typeof(StringEnumConverter))]
public enum SalesResUsersOdooEnum
{
[EnumMember(Value = "false")]
None = 1,

[EnumMember(Value = "9")]
UserOwnDocumentsOnly = 2,

[EnumMember(Value = "18")]
UserAllDocuments = 3,

[EnumMember(Value = "10")]
Manager = 4,
}

Note that the value 10 in the Exception is the 4th EnumMember Value of the SalesResusersOdooEnum enum.

Exception Details

System.Exception: Not implemented json mapping value: '$\"sel_groups_9_18_10\": 10' to Nullable`1\n at PortaCapena.OdooJsonRpcClient.Converters.OdooModelMapper.ConverOdooPropertyToDotNet(Type dotnetType, JToken value, Object& result)\n at PortaCapena.OdooJsonRpcClient.Converters.OdooModelConverter.ReadJson(JsonReader reader, Type objectType, Object existingValue, JsonSerializer serializer)\n at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.DeserializeConvertable(JsonConverter converter, JsonReader reader, Type objectType, Object existingValue)\n at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.PopulateList(IList list, JsonReader reader, JsonArrayContract contract, JsonProperty containerProperty, String id)\n at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateList(JsonReader reader, Type objectType, JsonContract contract, JsonProperty member, Object existingValue, String id)\n at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateValueInternal(JsonReader reader, Type objectType, JsonContract contract, JsonProperty member, JsonContainerContract containerContract, JsonProperty containerMember, Object existingValue)\n at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.SetPropertyValue(JsonProperty property, JsonConverter propertyConverter, JsonContainerContract containerContract, JsonProperty containerProperty, JsonReader reader, Object target)\n at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.PopulateObject(Object newObject, JsonReader reader, JsonObjectContract contract, JsonProperty member, String id)\n at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateObject(JsonReader reader, Type objectType, JsonContract contract, JsonProperty member, JsonContainerContract containerContract, JsonProperty containerMember, Object existingValue)\n at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateValueInternal(JsonReader reader, Type objectType, JsonContract contract, JsonProperty member, JsonContainerContract containerContract, JsonProperty containerMember, Object existingValue)\n at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.Deserialize(JsonReader reader, Type objectType, Boolean checkAdditionalContent)\n at Newtonsoft.Json.JsonSerializer.DeserializeInternal(JsonReader reader, Type objectType)\n at Newtonsoft.Json.JsonSerializer.Deserialize(JsonReader reader, Type objectType)\n at Newtonsoft.Json.JsonConvert.DeserializeObject(String value, Type type, JsonSerializerSettings settings)\n at Newtonsoft.Json.JsonConvert.DeserializeObject[T](String value, JsonSerializerSettings settings)\n at Newtonsoft.Json.JsonConvert.DeserializeObject[T](String value)\n at PortaCapena.OdooJsonRpcClient.OdooClient.CallAndDeserializeAsync[T](OdooRequestModel request, CancellationToken cancellationToken), \n "

Possible solution

My guess is that in OdooModelMapper.ConverOdooPropertyToDotNet switch, there should be branches for JTokenType.Integer similar to the following JTokenType.String branches :

 case JTokenType.String when dotnetType.IsEnum:
    // ...
case JTokenType.String when dotnetType.IsGenericType && dotnetType.GetGenericTypeDefinition() == typeof(Nullable<>) && dotnetType.GenericTypeArguments.Length == 1 && dotnetType.GenericTypeArguments[0].IsEnum:
    // ...

Environment

.NET 6 on Mac M1 Odoo v11