Пример #1
0
        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);
        }
Пример #2
0
        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);
            }
        }
Пример #3
0
        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);
        }
Пример #4
0
 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);
             }
         }
     }
 }
Пример #5
0
 public StructureService(IStructureRepository structureRepo, IMapper mapper)
 {
     _structureRepository = structureRepo;
     structureMapping     = new StructureMapping();
 }
Пример #6
0
        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);
        }