using System.Collections;
using System.Collections.Generic;
using System.Runtime.Serialization.Formatters;
using System.ComponentModel.DataAnnotations;
using System.Globalization;
using System.Collections.ObjectModel;
using Newtonsoft.Json.Linq;
using Newtonsoft.Json.Converters;
using Newtonsoft.Json.Serialization;
public partial class Root
public Info Info { get; set; }
[JsonProperty("entity_data")]
public EntityData EntityData { get; set; }
public Datum[] Data { get; set; }
public partial class Datum
[JsonProperty("instance_data")]
public InstanceData InstanceData { get; set; }
[JsonProperty("single_permission")]
public object SinglePermission { get; set; }
public partial class InstanceData
public string Id { get; set; }
[JsonProperty("insertTimestamp")]
public string InsertTimestamp { get; set; }
[JsonProperty("field_groups")]
public FieldGroup[] FieldGroups { get; set; }
public partial class FieldGroup
[JsonProperty("field_group_data")]
public FieldGroupData FieldGroupData { get; set; }
[JsonProperty("fields_data")]
public FieldsDatum[][] FieldsData { get; set; }
public partial class FieldGroupData
[JsonProperty("group_name")]
public string GroupName { get; set; }
[JsonProperty("group_data_name")]
public string GroupDataName { get; set; }
[JsonProperty("group_id")]
[JsonConverter(typeof(ParseStringConverter))]
public long GroupId { get; set; }
[JsonProperty("repeatable_group")]
[JsonConverter(typeof(ParseStringConverter))]
public long RepeatableGroup { get; set; }
[JsonProperty("permissions")]
public Permissions Permissions { get; set; }
public partial class Permissions
public string Type { get; set; }
[JsonConverter(typeof(ParseStringConverter))]
public long Code { get; set; }
public partial class FieldsDatum
[JsonProperty("field_name")]
public string FieldName { get; set; }
[JsonProperty("field_type_name")]
public FieldTypeName FieldTypeName { get; set; }
[JsonProperty("field_data_name")]
public string FieldDataName { get; set; }
[JsonProperty("placeholder")]
public object Placeholder { get; set; }
[JsonProperty("default_value")]
public string DefaultValue { get; set; }
[JsonProperty("act_as_assign")]
public string ActAsAssign { get; set; }
[JsonProperty("custom_validation")]
public CustomValidation CustomValidation { get; set; }
public string Value { get; set; }
[JsonProperty("group_index")]
public long GroupIndex { get; set; }
[JsonProperty("possible_values", NullValueHandling = NullValueHandling.Ignore)]
public string PossibleValues { get; set; }
public partial class CustomValidation
[JsonProperty("unable_to_edit")]
[JsonConverter(typeof(ParseStringConverter))]
public long UnableToEdit { get; set; }
[JsonProperty("data_type", NullValueHandling = NullValueHandling.Ignore)]
[JsonConverter(typeof(ParseStringConverter))]
public long? DataType { get; set; }
[JsonProperty("alphabetical_order", NullValueHandling = NullValueHandling.Ignore)]
[JsonConverter(typeof(ParseStringConverter))]
public long? AlphabeticalOrder { get; set; }
public partial class EntityData
[JsonProperty("entity_name")]
public string EntityName { get; set; }
[JsonProperty("entity_data_name")]
public string EntityDataName { get; set; }
[JsonProperty("permissions")]
public Permissions Permissions { get; set; }
public string View { get; set; }
public partial class Info
[JsonProperty("total_count")]
public long TotalCount { get; set; }
[JsonProperty("current_page_total_count")]
public long CurrentPageTotalCount { get; set; }
[JsonProperty("max_each_page")]
public long MaxEachPage { get; set; }
[JsonProperty("current_page_number")]
public long CurrentPageNumber { get; set; }
[JsonProperty("total_pages")]
public long TotalPages { get; set; }
public enum FieldTypeName { InputEmail, InputText, SelectList };
public partial class Root
public static Root FromJson(string json) => JsonConvert.DeserializeObject<Root>(json, Converter.Settings);
public static class Serialize
public static string ToJson(this Root self) => JsonConvert.SerializeObject(self, Converter.Settings);
internal static class Converter
public static readonly JsonSerializerSettings Settings = new JsonSerializerSettings
MetadataPropertyHandling = MetadataPropertyHandling.Ignore,
DateParseHandling = DateParseHandling.None,
FieldTypeNameConverter.Singleton,
new IsoDateTimeConverter { DateTimeStyles = DateTimeStyles.AssumeUniversal }
internal class ParseStringConverter : JsonConverter
public override bool CanConvert(Type t) => t == typeof(long) || t == typeof(long?);
public override object ReadJson(JsonReader reader, Type t, object existingValue, JsonSerializer serializer)
if (reader.TokenType == JsonToken.Null) return null;
var value = serializer.Deserialize<string>(reader);
if (Int64.TryParse(value, out l))
throw new Exception("Cannot unmarshal type long");
public override void WriteJson(JsonWriter writer, object untypedValue, JsonSerializer serializer)
if (untypedValue == null)
serializer.Serialize(writer, null);
var value = (long)untypedValue;
serializer.Serialize(writer, value.ToString());
public static readonly ParseStringConverter Singleton = new ParseStringConverter();
internal class FieldTypeNameConverter : JsonConverter
public override bool CanConvert(Type t) => t == typeof(FieldTypeName) || t == typeof(FieldTypeName?);
public override object ReadJson(JsonReader reader, Type t, object existingValue, JsonSerializer serializer)
if (reader.TokenType == JsonToken.Null) return null;
var value = serializer.Deserialize<string>(reader);
return FieldTypeName.InputEmail;
return FieldTypeName.InputText;
return FieldTypeName.SelectList;
throw new Exception("Cannot unmarshal type FieldTypeName");
public override void WriteJson(JsonWriter writer, object untypedValue, JsonSerializer serializer)
if (untypedValue == null)
serializer.Serialize(writer, null);
var value = (FieldTypeName)untypedValue;
case FieldTypeName.InputEmail:
serializer.Serialize(writer, "input-email");
case FieldTypeName.InputText:
serializer.Serialize(writer, "input-text");
case FieldTypeName.SelectList:
serializer.Serialize(writer, "select-list");
throw new Exception("Cannot marshal type FieldTypeName");
public static readonly FieldTypeNameConverter Singleton = new FieldTypeNameConverter();
public static void Test()
var myJsonResponse = GetJson();
var myDeserializedClass = JsonConvert.DeserializeObject<Root>(myJsonResponse, Converter.Settings);
myDeserializedClass.Dump();
static string GetJson() => @"{
""current_page_total_count"": 2,
""current_page_number"": 1,
""entity_name"": ""\u05de\u05d0\u05d9\u05e8"",
""entity_data_name"": ""e_130"",
""_id"": ""60a3a82a956ecd3228739ced"",
""insertTimestamp"": ""2021-05-18T14:42:34+0300"",
""group_name"": ""\u05e1\u05e4\u05e8 \u05d8\u05dc\u05e4\u05d5\u05e0\u05d9\u05dd"",
""group_data_name"": ""g_353"",
""repeatable_group"": ""0"",
""field_name"": ""\u05e9\u05dd \u05e4\u05e8\u05d8\u05d9"",
""field_type_name"": ""input-text"",
""field_data_name"": ""fld_2372"",
""unable_to_edit"": ""0"",
""value"": ""\u05de\u05d0\u05d9\u05e8"",
""field_name"": ""\u05e9\u05dd \u05de\u05e9\u05e4\u05d7\u05d4"",
""field_type_name"": ""input-text"",
""field_data_name"": ""fld_2373"",
""unable_to_edit"": ""0"",
""value"": ""\u05e8\u05d5\u05d8\u05e4\u05dc\u05d9\u05d9\u05e9"",
""field_name"": ""\u05d9\u05d9\u05e9\u05d5\u05d1 \u05de\u05d2\u05d5\u05e8\u05d9\u05dd"",
""field_type_name"": ""select-list"",
""field_data_name"": ""fld_2374"",
""possible_values"": ""[\""\\u05db\\u05e4\\u05e8 \\u05e1\\u05d1\\u05d0\"",\""\\u05ea\\u05dc \\u05d0\\u05d1\\u05d9\\u05d1\"",\""\\u05e2\\u05d6\\u05d4\"",\""\\u05d9\\u05e8\\u05d5\\u05e9\\u05dc\\u05d9\\u05dd\""]"",
""unable_to_edit"": ""0"",
""alphabetical_order"": ""0""
""value"": ""\u05db\u05e4\u05e8 \u05e1\u05d1\u05d0"",
""field_name"": ""\u05d8\u05dc\u05e4\u05d5\u05df"",
""field_type_name"": ""input-text"",
""field_data_name"": ""fld_2375"",
""unable_to_edit"": ""0"",
""value"": ""055098393"",
""field_name"": ""\u05de\u05d9\u05d9\u05dc"",
""field_type_name"": ""input-email"",
""field_data_name"": ""fld_2376"",
""unable_to_edit"": ""0""
""value"": ""meir@arma.co.il"",
""single_permission"": null
""_id"": ""60a3a7e6788c2124f12b5370"",
""insertTimestamp"": ""2021-05-18T14:41:26+0300"",
""group_name"": ""\u05e1\u05e4\u05e8 \u05d8\u05dc\u05e4\u05d5\u05e0\u05d9\u05dd"",
""group_data_name"": ""g_353"",
""repeatable_group"": ""0"",
""field_name"": ""\u05e9\u05dd \u05e4\u05e8\u05d8\u05d9"",
""field_type_name"": ""input-text"",
""field_data_name"": ""fld_2372"",
""unable_to_edit"": ""0"",
""value"": ""\u05d0\u05e8\u05d9\u05d4"",
""field_name"": ""\u05e9\u05dd \u05de\u05e9\u05e4\u05d7\u05d4"",
""field_type_name"": ""input-text"",
""field_data_name"": ""fld_2373"",
""unable_to_edit"": ""0"",
""value"": ""\u05de\u05e6\u05dc\u05d9\u05d7"",
""field_name"": ""\u05d9\u05d9\u05e9\u05d5\u05d1 \u05de\u05d2\u05d5\u05e8\u05d9\u05dd"",
""field_type_name"": ""select-list"",
""field_data_name"": ""fld_2374"",
""possible_values"": ""[\""\\u05db\\u05e4\\u05e8 \\u05e1\\u05d1\\u05d0\"",\""\\u05ea\\u05dc \\u05d0\\u05d1\\u05d9\\u05d1\"",\""\\u05e2\\u05d6\\u05d4\"",\""\\u05d9\\u05e8\\u05d5\\u05e9\\u05dc\\u05d9\\u05dd\""]"",
""unable_to_edit"": ""0"",
""alphabetical_order"": ""0""
""value"": ""\u05e2\u05d6\u05d4"",
""field_name"": ""\u05d8\u05dc\u05e4\u05d5\u05df"",
""field_type_name"": ""input-text"",
""field_data_name"": ""fld_2375"",
""unable_to_edit"": ""0"",
""value"": ""055098393"",
""field_name"": ""\u05de\u05d9\u05d9\u05dc"",
""field_type_name"": ""input-email"",
""field_data_name"": ""fld_2376"",
""unable_to_edit"": ""0""
""value"": ""arie@arma.co.il"",
""single_permission"": null
public static void Main()
Console.WriteLine("Environment version: {0} ({1})", System.Runtime.InteropServices.RuntimeInformation.FrameworkDescription , GetNetCoreVersion());
Console.WriteLine("{0} version: {1}", typeof(JsonSerializer).Assembly.GetName().Name, typeof(JsonSerializer).Assembly.FullName);
Console.WriteLine("Failed with unhandled exception: ");
public static string GetNetCoreVersion()
var assembly = typeof(System.Runtime.GCSettings).GetTypeInfo().Assembly;
var assemblyPath = assembly.Location.Split(new[] { '/', '\\' }, StringSplitOptions.RemoveEmptyEntries);
int netCoreAppIndex = Array.IndexOf(assemblyPath, "Microsoft.NETCore.App");
if (netCoreAppIndex > 0 && netCoreAppIndex < assemblyPath.Length - 2)
return assemblyPath[netCoreAppIndex + 1];