Skip to content

Commit

Permalink
🐛 Added missing IntegerConverter
Browse files Browse the repository at this point in the history
  • Loading branch information
BetimBeja committed Apr 20, 2022
1 parent 7b9173c commit ab15a2c
Show file tree
Hide file tree
Showing 7 changed files with 62 additions and 7 deletions.
4 changes: 3 additions & 1 deletion XrmEntitySerializer.Tests/EntityTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -185,6 +185,8 @@ public void EarlyBoundEntityCanBeSerializedAndDeserialized()
entityReference.Name = "Primary Contact";
entity.PrimaryContactId = entityReference;
entity.FormattedValues.Add("primarycontactid", entityReference.Name);
entity.NumberOfEmployees = 1;

#if !XRM_7 && !XRM_6 && !XRM_5
entity.KeyAttributes.Add("name", "Unique Account");
#endif
Expand All @@ -208,7 +210,7 @@ public void EarlyBoundEntityCanBeSerializedAndDeserialized()
Assert.Equal(entity.LogicalName, deserializedEntity.LogicalName);
Assert.Equal(entity.Id, deserializedEntity.Id);
Assert.Equal(entity.Attributes.Count, deserializedEntity.Attributes.Count);

Assert.Equal(entity.NumberOfEmployees, deserializedEntity.NumberOfEmployees);
#if !XRM_7 && !XRM_6 && !XRM_5
Assert.Equal(entity.KeyAttributes.Count, deserializedEntity.KeyAttributes.Count);
#endif
Expand Down
8 changes: 4 additions & 4 deletions XrmEntitySerializer.Version.props
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,9 @@
<authors>Betim Beja</authors>
<owners>Betim Beja</owners>
<Copyright>Betim Beja</Copyright>
<Version>1.3.3</Version>
<PackageVersion>1.3.3</PackageVersion>
<FileVersion>1.3.3.0</FileVersion>
<AssemblyVersion>1.3.3.0</AssemblyVersion>
<Version>1.3.4</Version>
<PackageVersion>1.3.4</PackageVersion>
<FileVersion>1.3.4.0</FileVersion>
<AssemblyVersion>1.3.4.0</AssemblyVersion>
</PropertyGroup>
</Project>
4 changes: 2 additions & 2 deletions XrmEntitySerializer.props
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,8 @@
This library can serialize an Microsoft.Xrm.Sdk.Entity to Json and back using Newtonsoft.Json library.
</Description>
<PackageReleaseNotes>
- v1.3.3:
a. Fixed a bug with Early-Bound entities
- v1.3.4:
a. Added missing IntegerConverter
</PackageReleaseNotes>
</PropertyGroup>
<PropertyGroup>
Expand Down
5 changes: 5 additions & 0 deletions XrmEntitySerializer/EntitySerializer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ public EntitySerializer() : base()
TypeNameHandling = TypeNameHandling.All;
ContractResolver = new XrmContractResolver();
Converters.Add(new GuidConverter());
Converters.Add(new IntegerConverter());
Converters.Add(new DecimalConverter());
Converters.Add(new OptionSetValueConverter());
Converters.Add(new AttributeCollectionConverter());
Expand Down Expand Up @@ -51,6 +52,10 @@ public EntitySerializer(IEnumerable<JsonConverter> converters) : base()
{
Converters.Add(new GuidConverter());
}
if (!converters.Any(x => x.CanConvert(typeof(int))))
{
Converters.Add(new IntegerConverter());
}
if (!converters.Any(x => x.CanConvert(typeof(decimal))))
{
Converters.Add(new DecimalConverter());
Expand Down
42 changes: 42 additions & 0 deletions XrmEntitySerializer/IntegerConverter.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
using System;
using System.Globalization;
using Newtonsoft.Json;

namespace XrmEntitySerializer
{
public class IntegerConverter : ValueTypeConverter
{
public override bool CanConvert(Type objectType)
{
return typeof(int) == objectType || typeof(int?) == objectType;
}

public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
writer.WriteStartObject();
writer.WritePropertyName("$type");
writer.WriteValue(string.Format("{0}, {1}", value.GetType().FullName, value.GetType().Assembly.GetName().Name));
writer.WritePropertyName("$value");
writer.WriteValue(value.ToString());
writer.WriteEndObject();
}

protected override object ReadValue(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
int result;
if (reader.TokenType == JsonToken.Null)
{
if (objectType != typeof(int?))
{
throw new JsonSerializationException(String.Format(CultureInfo.InvariantCulture, "Cannot convert null value to {0}.", objectType));
}
return default(int?);
}
else if (!int.TryParse(reader.Value.ToString(), out result))
{
throw new JsonSerializationException(string.Format(CultureInfo.InvariantCulture, "Unexpected token or value when parsing Integer. Token: {0}, Value: {1}", reader.TokenType, reader.Value));
}
return result;
}
}
}
5 changes: 5 additions & 0 deletions XrmEntitySerializer/ValueTypeConverter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,11 @@ public override object ReadJson(JsonReader reader, Type objectType, object exist
return ReadValue(reader, objectType, existingValue, serializer);
}

if (reader.TokenType == JsonToken.Integer)
{
return ReadValue(reader, objectType, existingValue, serializer);
}

for (int i = 0; i < 2; i++)
{
reader.Read();
Expand Down
1 change: 1 addition & 0 deletions XrmEntitySerializer/XrmEntitySerializer.projitems
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
</PropertyGroup>
<ItemGroup>
<Compile Include="$(MSBuildThisFileDirectory)AttributeCollectionConverter.cs" />
<Compile Include="$(MSBuildThisFileDirectory)IntegerConverter.cs" />
<Compile Include="$(MSBuildThisFileDirectory)OptionSetValueConverter.cs" />
<Compile Include="$(MSBuildThisFileDirectory)OptionSetValueCollectionConverter.cs" />
<Compile Include="$(MSBuildThisFileDirectory)ParameterCollectionConverter.cs" />
Expand Down

0 comments on commit ab15a2c

Please sign in to comment.