FilterRule_Newtonsoft.cs 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Diagnostics.CodeAnalysis;
  4. using Newtonsoft.Json;
  5. using Newtonsoft.Json.Linq;
  6. namespace Vit.Linq.QueryBuilder.NewtonsoftJson
  7. {
  8. /// <summary>
  9. /// This class is used to define a hierarchical filter for a given collection. This type can be serialized/deserialized by JSON.NET without needing to modify the data structure from QueryBuilder.
  10. /// </summary>
  11. [ExcludeFromCodeCoverage]
  12. public class FilterRule_Newtonsoft : IFilterRule
  13. {
  14. /// <summary>
  15. /// condition - acceptable values are "and" and "or".
  16. /// </summary>
  17. public string condition { get; set; }
  18. public string field { get; set; }
  19. public string @operator { get; set; }
  20. /// <summary>
  21. /// nested filter rules.
  22. /// </summary>
  23. public List<FilterRule_Newtonsoft> rules { get; set; }
  24. /// <summary>
  25. /// Gets or sets the value of the filter.
  26. /// </summary>
  27. /// <value>
  28. /// The value.
  29. /// </value>
  30. public object value
  31. {
  32. get
  33. {
  34. if (_value is JToken jt)
  35. {
  36. return GetPrimitiveValue(jt);
  37. }
  38. return _value;
  39. }
  40. set => _value = value;
  41. }
  42. private object _value;
  43. IEnumerable<IFilterRule> IFilterRule.rules => rules;
  44. public static FilterRule_Newtonsoft FromString(string filter)
  45. {
  46. return JsonConvert.DeserializeObject<FilterRule_Newtonsoft>(filter, serializeSetting);
  47. }
  48. static readonly global::Newtonsoft.Json.JsonSerializerSettings serializeSetting = new global::Newtonsoft.Json.JsonSerializerSettings() { Converters = { new ValueConverter() } };
  49. public static object GetPrimitiveValue(JToken value)
  50. {
  51. if (value is JValue jv)
  52. {
  53. return jv.Value;
  54. }
  55. if (value is JArray ja)
  56. {
  57. List<object> values = new List<object>();
  58. foreach (JValue item in ja)
  59. {
  60. values.Add(item.Value);
  61. }
  62. return values;
  63. }
  64. return value;
  65. }
  66. class ValueConverter : JsonConverter
  67. {
  68. public override bool CanConvert(Type objectType)
  69. {
  70. return objectType == typeof(object);
  71. }
  72. public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
  73. {
  74. JToken token = JToken.Load(reader);
  75. return GetPrimitiveValue(token);
  76. }
  77. public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
  78. {
  79. throw new NotImplementedException();
  80. }
  81. }
  82. }
  83. }