コード例 #1
0
        /// <summary>
        /// Generates JsonSerializerSettings for given lenient parsing setting
        /// </summary>
        /// <param name="lenient"></param>
        /// <param name="userPropertiesWhiteList"></param>
        /// <returns></returns>
        public static JsonSerializerSettings GetJsonSerializerSettings(this LenientParsing lenient, HashSet <string> userPropertiesWhiteList)
        {
            List <JsonConverter> converters = new List <JsonConverter>();

            foreach (LenientParsing lp in Enum.GetValues(typeof(LenientParsing)))
            {
                if (lenient.HasFlag(lp))
                {
                    switch (lp)
                    {
                    case LenientParsing.DateTime:
                        if (!lenient.HasFlag(LenientParsing.SetInitialDateIfNull))
                        {
                            converters.Add(new LenientDateTimeConverter());
                        }
                        else
                        {
                            converters.Add(new LenientDateTimeConverter(new DateTimeOffset()));
                        }
                        break;

                    case LenientParsing.EnumList:
                        converters.Add(new LenientEnumListConverter());
                        break;

                    case LenientParsing.Bo4eUri:
                        converters.Add(new LenientBo4eUriConverter());
                        break;

                    case LenientParsing.StringToInt:
                        converters.Add(new LenientStringToIntConverter());
                        break;
                        // case LenientParsing.EmptyLists:
                        // converters.Add(new LenientRequiredListConverter());
                        // break;

                        // no default case because NONE and MOST_LENIENT do not come up with more converters
                    }
                }
            }
            IContractResolver contractResolver;

            if (userPropertiesWhiteList.Count > 0)
            {
                contractResolver = new UserPropertiesDataContractResolver(userPropertiesWhiteList);
            }
            else
            {
                contractResolver = new DefaultContractResolver();
            }
            JsonSerializerSettings settings = new JsonSerializerSettings
            {
                Converters        = converters,
                DateParseHandling = DateParseHandling.None,
                ContractResolver  = contractResolver
            };

            return(settings);
        }
コード例 #2
0
        public void TestVertragStringToInt()
        {
            // first test serialization of complete business object
            JObject json;

            using (StreamReader r = new StreamReader("BoMapperTests/Vertrag_lenient_String.json"))
            {
                string jsonString = r.ReadToEnd();
                json = JsonConvert.DeserializeObject <JObject>(jsonString);
            }
            LenientParsing lenients = LenientParsing.StringToInt;
            Vertrag        v        = JsonConvert.DeserializeObject <Vertrag>(json["input"].ToString(), lenients.GetJsonSerializerSettings());

            Assert.AreEqual(v.Vertragskonditionen.AnzahlAbschlaege, 12);
        }
コード例 #3
0
 public static BusinessObject MapObject(string businessObjectName, JObject jobject, HashSet <string> userPropertiesWhiteList, LenientParsing lenient = LenientParsing.Strict)
 {
     return(MapObject(GetTypeForBoName(businessObjectName), jobject, userPropertiesWhiteList, lenient));
 }
コード例 #4
0
 /// <summary>
 /// <see cref="MapObject(Type, JObject, HashSet{string}, LenientParsing)"/>
 /// </summary>
 public static BusinessObjectType MapObject <BusinessObjectType>(JObject jobject, LenientParsing lenient = LenientParsing.Strict)
 {
     return((BusinessObjectType)Convert.ChangeType(MapObject(typeof(BusinessObjectType), jobject, lenient), typeof(BusinessObjectType)));
 }
コード例 #5
0
 /// <summary>
 /// <see cref="MapObject(Type, JObject, HashSet{string}, LenientParsing)"/> with empty user properties white list
 /// </summary>
 public static BusinessObject MapObject(Type businessObjectType, JObject jobject, LenientParsing lenient = LenientParsing.Strict)
 {
     return(MapObject(businessObjectType, jobject, new HashSet <string>(), lenient));
 }
コード例 #6
0
 /// <summary>
 /// <see cref="MapObject(string, JObject, HashSet{string}, LenientParsing)"/> with empty user properties white list
 /// </summary>
 public static BusinessObject MapObject(string businessObjectName, JObject jobject, LenientParsing lenient = LenientParsing.Strict)
 {
     return(MapObject(GetTypeForBoName(businessObjectName), jobject, new HashSet <string>(), lenient));
 }
コード例 #7
0
        /// <summary>
        /// shortcut for <see cref="MapObject(string, JObject, LenientParsing)"/> iff <paramref name="jobject"/> has key 'boTyp'
        /// </summary>
        /// <param name="jobject">business object json</param>
        /// <param name="lenient">lenient parsing flags</param>
        /// <param name="userPropertiesWhiteList">white list of non BO4E standard field you'd like to have de-serialised</param>
        /// <returns><see cref="MapObject(string, JObject, LenientParsing)"/></returns>
        public static BusinessObject MapObject(JObject jobject, HashSet <string> userPropertiesWhiteList, LenientParsing lenient = LenientParsing.Strict)
        {
            if (jobject["boTyp"] == null)
            {
                throw new ArgumentNullException("boTyp", "Either call MapObject(JObject) with a Business Object containing the mandatory 'boTyp' key or explicitly name the Object");
            }
            Type businessObjectType = GetTypeForBoName(jobject["boTyp"].ToString());

            return(MapObject(businessObjectType, jobject, userPropertiesWhiteList, lenient));
        }
コード例 #8
0
        /// <summary>
        /// <see cref="MapObject(Type, JObject, HashSet{string}, LenientParsing)"/>
        /// </summary>
        /// <typeparam name="BusinessObjectType">type of return value</typeparam>
        /// <param name="jobject"><see cref="MapObject(Type, JObject, HashSet{string}, LenientParsing)"/></param>
        /// <param name="userPropertiesWhiteList"><see cref="MapObject(Type, JObject, HashSet{string}, LenientParsing)"/></param>
        /// <param name="lenient"><see cref="MapObject(Type, JObject, HashSet{string}, LenientParsing)"/></param>
        /// <returns><see cref="MapObject(Type, JObject, HashSet{string}, LenientParsing)"/></returns>
        public static BusinessObjectType MapObject <BusinessObjectType>(JObject jobject, HashSet <string> userPropertiesWhiteList, LenientParsing lenient = LenientParsing.Strict)
        {
            Type businessObjectType = typeof(BusinessObjectType);

            return((BusinessObjectType)Convert.ChangeType(MapObject(businessObjectType, jobject, userPropertiesWhiteList, lenient), typeof(BusinessObjectType)));
        }
コード例 #9
0
 public static BusinessObject MapObject(Type businessObjectType, JObject jobject, HashSet <string> userPropertiesWhiteList, LenientParsing lenient = LenientParsing.Strict)
 {
     if (!businessObjectType.IsSubclassOf(typeof(BusinessObject)))
     {
         throw new ArgumentException("Mapping is only allowed for types derived from BO4E.BO.BusinessObject");
     }
     else if (businessObjectType != null)
     {
         if (lenient == LenientParsing.Strict && userPropertiesWhiteList.Count == 0)
         {
             return((BusinessObject)jobject.ToObject(businessObjectType));
         }
         else
         {
             var settings = lenient.GetJsonSerializerSettings();
             return((BusinessObject)JsonConvert.DeserializeObject(jobject.ToString(), businessObjectType, settings));
         }
     }
     else
     {
         return(null);
     }
 }
コード例 #10
0
        public void TestBoMapping()
        {
            string[] files = Directory.GetFiles($"BoMapperTests/", "*.json");
            foreach (string file in files)
            {
                JObject json;
                using (StreamReader r = new StreamReader(file))
                {
                    string jsonString = r.ReadToEnd();
                    json = JsonConvert.DeserializeObject <JObject>(jsonString);
                }
                Assert.IsNotNull(json["objectName"], $"You have to specify the object name in test file {file}");
                LenientParsing lenients = LenientParsing.Strict; // default
                if (json["lenientDateTime"] != null && (bool)json["lenientDateTime"])
                {
                    lenients |= LenientParsing.DateTime;
                }

                if (json["lenientEnumList"] != null && (bool)json["lenientEnumList"])
                {
                    lenients |= LenientParsing.EnumList;
                }

                if (json["lenientBo4eUri"] != null && (bool)json["lenientBo4eUri"])
                {
                    lenients |= LenientParsing.Bo4eUri;
                }

                if (json["lenientStringToInt"] != null && (bool)json["lenientStringToInt"])
                {
                    lenients |= LenientParsing.StringToInt;
                }
                BusinessObject bo;
                try
                {
                    bo = JsonConvert.DeserializeObject <BusinessObject>(json["input"].ToString(), lenients.GetJsonSerializerSettings());
                }
                catch (Exception e) when(e is ArgumentException || e is JsonSerializationException)
                {
                    bo = BoMapper.MapObject(json["objectName"].ToString(), (JObject)json["input"], lenients);
                }
                string regularOutputString = JsonConvert.SerializeObject(bo, new StringEnumConverter());
                if (bo.GetType() == typeof(Rechnung))
                {
                    continue; // todo: fix this!
                }

                /*if (json["input"]["boTyp"] != null)
                 * {
                 *  //BusinessObject bo2 = BoMapper.MapObject((JObject)json["input"], lenients);
                 *  BusinessObject bo2 = JsonConvert.DeserializeObject<BusinessObject>(json["input"].ToString(), BoMapper.GetJsonSerializerSettings(lenients));
                 *  //string regularOutputString2 = JsonConvert.SerializeObject(bo2, new StringEnumConverter());
                 *  Assert.AreEqual(bo, bo2);
                 *  switch (json["input"]["boTyp"].ToString().ToLower())
                 *  {
                 *      case "energiemenge":
                 *          //Assert.AreEqual((Energiemenge)bo, BoMapper.MapObject<Energiemenge>((JObject)json["input"], lenients));
                 *          Assert.AreEqual((Energiemenge)bo, JsonConvert.DeserializeObject<Energiemenge>(json["input"].ToString(), BoMapper.GetJsonSerializerSettings(lenients)));
                 *          break;
                 *      case "messlokation":
                 *          //Assert.AreEqual((Messlokation)bo, BoMapper.MapObject<Messlokation>((JObject)json["input"], lenients));
                 *          Assert.AreEqual((Messlokation)bo, JsonConvert.DeserializeObject<Messlokation>(json["input"].ToString(), BoMapper.GetJsonSerializerSettings(lenients)));
                 *          break;
                 *          // add more if you feel like
                 *  }
                 * }*/
                HashSet <string> whitelist;
                if (json["userPropWhiteList"] != null)
                {
                    whitelist = new HashSet <string>(JArray.FromObject(json["userPropWhiteList"]).ToObject <List <string> >());
                }
                else
                {
                    whitelist = new HashSet <string>();
                }
                if (lenients == LenientParsing.Strict)
                {
                    foreach (LenientParsing lenient in Enum.GetValues(typeof(LenientParsing)))
                    {
                        // strict mappings must also work with lenient mapping
                        BusinessObject boLenient;
                        try
                        {
                            boLenient = JsonConvert.DeserializeObject <BusinessObject>(json["input"].ToString(), lenient.GetJsonSerializerSettings(whitelist));
                        }
                        catch (ArgumentException)
                        {
                            boLenient = BoMapper.MapObject(json["objectName"].ToString(), (JObject)json["input"], whitelist, lenient);
                        }
                        catch (JsonSerializationException jse)
                        {
                            Assert.IsTrue(false, $"Unexpected {nameof(JsonSerializationException)} in file {file}: {jse.Message}");
                            throw jse;
                        }
                        //string dateLenietOutputString = JsonConvert.SerializeObject(boLenient, new StringEnumConverter());
                        //if (whitelist.Count ==0) {
                        //Assert.AreEqual(regularOutputString, dateLenietOutputString);
                        //}
                        //else
                        // {
                        //    Assert.AreEqual(regularOutputString, dateLenietOutputString);
                        //}
                    }
                }
                else
                {
                    // non-strict test cases are designed such that they are not parseble in strict mode.
                    // bool exceptionThrown;
                    // try
                    //{
                    //    BusinessObject boStrict = BoMapper.MapObject(json["objectName"].ToString(), (JObject)json["input"], LenientParsing.Strict);
                    //    exceptionThrown = false;
                    //}
                    //catch (Exception)
                    //{
                    //    exceptionThrown = true;
                    // }
                    //Assert.IsTrue(exceptionThrown);
                }
            }
        }
コード例 #11
0
 /// <summary>
 /// <inheritdoc cref="GetJsonSerializerSettings(LenientParsing, HashSet{string})"/>
 /// </summary>
 /// <param name="lenient"></param>
 /// <returns></returns>
 public static JsonSerializerSettings GetJsonSerializerSettings(this LenientParsing lenient)
 {
     return(GetJsonSerializerSettings(lenient, new HashSet <string>()));
 }