Skip to content

Commit

Permalink
Fix criteria DateTimeOffset and DateTime JSON parsing (#7180)
Browse files Browse the repository at this point in the history
* fix criteria json parsing not trying to convert datetimeoffset and datetime

* handle array of items in criteria

* add convert value override to DateTimeOffsetField that tries to parse it as DateTimeOffset isn't extending IConvertible

revert CriteriaJsonConverter
  • Loading branch information
furkanevran authored Jun 14, 2024
1 parent 706db31 commit 5c0f406
Show file tree
Hide file tree
Showing 3 changed files with 40 additions and 7 deletions.
2 changes: 1 addition & 1 deletion src/Serenity.Net.Data/Criteria/CriteriaJsonConverter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -126,7 +126,7 @@ private BaseCriteria Parse(JsonElement[] array)
throw new ArgumentNullException("item");

if (item.ValueKind == JsonValueKind.String)
list.Add(item.GetString());
list.Add(item.GetString());
else if (item.ValueKind == JsonValueKind.Number)
list.Add(item.GetDouble());
else if (item.ValueKind == JsonValueKind.True)
Expand Down
35 changes: 35 additions & 0 deletions src/Serenity.Net.Entity/FieldTypes/DateTimeOffsetField.cs
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,41 @@ public static DateTimeOffsetField Factory(ICollection<Field> collection, string
return new DateTimeOffsetField(collection, name, caption, size, flags, getValue, setValue);
}

/// <summary>
/// Converts the value.
/// </summary>
/// <param name="source">The source.</param>
/// <param name="provider">The provider.</param>
/// <returns></returns>
public override object ConvertValue(object source, IFormatProvider provider)
{
if (source is Newtonsoft.Json.Linq.JValue jValue)
source = jValue.Value;

if (source == null)
return null;

if (source is DateTime dt)
return dt;

if (source is DateTimeOffset dto)
return dto.DateTime;

if (source is string s)
{
if (DateTimeOffset.TryParse(s, provider, DateTimeStyles.None, out var dtOffset))
return dtOffset;

if (s.TryParseISO8601DateTime(out var dateTime))
return dateTime;

if (DateTime.TryParse(s, provider, DateTimeStyles.None, out dateTime))
return dateTime;
}

return Convert.ChangeType(source, typeof(DateTime), provider);
}

/// <summary>
/// Gets field value from a data reader.
/// </summary>
Expand Down
10 changes: 4 additions & 6 deletions src/Serenity.Net.Entity/FieldTypes/GenericValueField.cs
Original file line number Diff line number Diff line change
Expand Up @@ -42,13 +42,11 @@ public override object ConvertValue(object source, IFormatProvider provider)

if (source == null)
return null;
else
{
if (source is TValue val)
return val;

return Convert.ChangeType(source, typeof(TValue), provider);
}
if (source is TValue val)
return val;

return Convert.ChangeType(source, typeof(TValue), provider);
}

/// <summary>
Expand Down

0 comments on commit 5c0f406

Please sign in to comment.