void GetObjectProperty(StructureMapping mapping, JsonWriter jsonWriter, Field fromField, JsonProperty element) { StructureMapping temp = GoOneLevelDeeper(mapping); ExtractValue(fromField.Structure, temp, JsonDocument.Parse(element.Value.GetRawText()), jsonWriter, fromField); }
void GetArrayProerties(StructureMapping mapping, JsonWriter jsonWriter, Field fromField, JsonProperty element) { var temp = new StructureMapping { Mappings = mapping.Mappings.Where(m => m.FromField.StartsWithIgnoreCase(element.Name)).ToList() }; foreach (var item in element.Value.EnumerateArray()) { var tempJsonWriter = new JsonWriter(); var doc = JsonDocument.Parse(item.GetRawText()); ExtractValue(fromField.Structure, GoOneLevelDeeper(temp), doc, tempJsonWriter, fromField); var itemWithoutName = tempJsonWriter.GetRoot().SubItems[0]; itemWithoutName.Name = ""; jsonWriter.AddItemToArray(temp.Mappings.First().ToField.Split('.')[0], itemWithoutName); } }
static StructureMapping GoOneLevelDeeper(StructureMapping mapping) { var temp = new StructureMapping(); foreach (var item in mapping.Mappings) { var from = item.FromField.Split('.'); if (from.Length > 1) { temp.Mappings.Add(new FieldMapping { ToField = item.ToField, FromField = string.Join(".", from.Skip(1)) }); } } return(temp); }
void ExtractValue(StructureDefinition fromStructure, StructureMapping mapping, JsonDocument doc, JsonWriter jsonWriter, Field fromField = null) { foreach (var element in doc.RootElement.EnumerateObject()) { if (mapping.Mappings.Any(m => m.FromField.StartsWithIgnoreCase(element.Name))) { var itemsStartsWithElementName = mapping.Mappings.Where(m => m.FromField.StartsWithIgnoreCase(element.Name)); if (element.Value.IsSimpleType()) { fromField = (fromField?.Structure ?? fromStructure).Fields.SingleOrDefault(m => m.Name.EqualsIgnoreCase(element.Name)); if (fromField == null) { throw new Exception(); } GetSimpleProperty(jsonWriter, fromField, element, itemsStartsWithElementName); } else if (element.Value.ValueKind == JsonValueKind.Object) { fromField = (fromField?.Structure ?? fromStructure).Fields.SingleOrDefault(m => m.Name.EqualsIgnoreCase(element.Name)); if (fromField == null) { throw new Exception(); } GetObjectProperty(mapping, jsonWriter, fromField, element); } else if (element.Value.ValueKind == JsonValueKind.Array) { fromField = (fromField?.Structure ?? fromStructure).Fields.SingleOrDefault(m => m.Name.EqualsIgnoreCase(element.Name)); if (fromField == null) { fromField = fromStructure.Fields.SingleOrDefault(m => m.Name.EqualsIgnoreCase(element.Name)); } if (fromField == null) { throw new Exception(); } GetArrayProerties(mapping, jsonWriter, fromField, element); } } } }
public StructureService(IStructureRepository structureRepo, IMapper mapper) { _structureRepository = structureRepo; structureMapping = new StructureMapping(); }
public async void Map_WithObjectStructure_ShouldCastToObject() { var json = System.Text.Json.JsonSerializer.Serialize(new { name = "Yashar", age = 34, address = new { country = "Iran", city = "Tabriz" }, items = new[] { new { name = "First", count = 3 }, new { name = "Second", count = 1 } } }); var fromStructure = new StructureDefinition { Id = "test", Fields = new List <Field> { Field.NotNullString("name", "name"), Field.NotNullInteger("age", "age"), new Field { Id = "test_address", Name = "address", DataType = DataTypeEnum.Object, Nullable = false, Structure = new StructureDefinition { Fields = new List <Field> { Field.NullableString("test_address_city", "city"), Field.NullableString("test_address_country", "country") } } }, new Field { Id = "test_items", Name = "items", DataType = DataTypeEnum.Array, Nullable = false, Structure = new StructureDefinition { Fields = new List <Field> { new Field { Id = "test_items_name", DataType = DataTypeEnum.String, Name = "name", Nullable = true }, new Field { Id = "test_items_count", DataType = DataTypeEnum.Integer, Name = "count", Nullable = true } } } } } }; var toStructure = new StructureDefinition { Id = "testTo", Fields = new List <Field> { Field.NotNullString("test_dest", "name"), Field.NotNullString("test_dest", "ad"), new Field { Id = "test_address", Name = "address", DataType = DataTypeEnum.Object, Nullable = false, Structure = new StructureDefinition { Fields = new List <Field> { Field.NullableString("test_address_city", "city") } } }, new Field { Id = "test_dest", Name = "dest", DataType = DataTypeEnum.Array, Nullable = false, Structure = new StructureDefinition { Fields = new List <Field> { new Field { Id = "test_dest_itemname", DataType = DataTypeEnum.String, Name = "itemName", Nullable = true }, Field.NotNullInteger("itemCount", "itemCount") } } } } }; var mapping = new StructureMapping { Mappings = new List <FieldMapping> { new FieldMapping { FromField = "name", ToField = "ad" }, new FieldMapping { FromField = "address.city", ToField = "addr.city" }, new FieldMapping { FromField = "name", ToField = "id" }, new FieldMapping { FromField = "items.name", ToField = "dest.itemName" }, new FieldMapping { FromField = "items.count", ToField = "dest.itemCount" } } }; StructureMapper mapper = new StructureMapper { DestinationStructure = toStructure, SourceStructure = fromStructure, Mapping = mapping }; var res = await mapper.Map <test>(json); Assert.Equal("Yashar", res.id); Assert.Equal("Yashar", res.Ad); Assert.Equal(2, res.Dest.Count); Assert.Equal("Tabriz", res.Addr.City); }