private static Penalty ExtractPenalty(JObject jPenlt) { var penalty = new Penalty { infState = "Infringing", permState = "None", submissionTime = DateTime.UtcNow, deprecationTime = null }; foreach (var jPenltKid in jPenlt.Children()) { var jProp = jPenltKid as JProperty; if (jProp == null) { continue; } try { var jValue = jProp.Value; JArray jArray = null; if (jProp.Value.Type == JTokenType.Array) { jArray = (JArray)jProp.Value; } switch (jProp.Name) { case "id": penalty.id = !string.IsNullOrWhiteSpace(jValue.ToString()) ? new ObjectId(jValue.ToString()) : ObjectId.GenerateNewId(); break; case "type": penalty.type = jValue.ToString(); break; case "infState": penalty.infState = jValue.ToString().Trim(); if (string.IsNullOrWhiteSpace(penalty.infState)) { penalty.infState = "Infringing"; } break; case "infLoc": penalty.infLoc = jValue.ToString(); break; case "infDisc": penalty.infDisc = jValue.ToString(); break; case "infType": penalty.infType = jValue.ToString(); break; //case "consType": // penalty.consType = jValue.ToString(); // break; //case "consPermits": // penalty.consPermits = (int)jValue; // break; case "permState": penalty.permState = jValue.ToString().Trim(); if (string.IsNullOrWhiteSpace(penalty.permState)) { penalty.permState = "None"; } break; case "distances": if (jArray == null) { break; } penalty.distances = new double[jArray.Count]; var ix = 0; foreach (var jToken in jArray) { penalty.distances[ix++] = (double)jToken; } break; case "totalDistance": penalty.totalDistance = (double)jValue; break; case "locations": var geoJson = jValue.ToString(Formatting.Indented); var geoDoc = BsonSerializer.Deserialize <GeoJsonFeatureCollection <GeoJson2DGeographicCoordinates> >(geoJson); penalty.locations = geoDoc; break; case "locationDescriptions": if (jArray == null) { break; } penalty.locationDescriptions = new string[jArray.Count][]; var il = 0; foreach (var jlocDescArray in jArray) { penalty.locationDescriptions[il] = new string[((JArray)jlocDescArray).Count]; var id = 0; foreach (var jLocDesc in jlocDescArray) { penalty.locationDescriptions[il][id++] = jLocDesc.ToString(); } il++; } break; case "parties": var parties = new List <Party>(); if (jArray != null) { parties.AddRange(jArray.Select(jParty => JsonConvert.DeserializeObject <Party>(jParty.ToString()))); } penalty.parties = parties.ToArray(); break; } } catch (Exception ex) { } } // clean up of unneeded elements var infOwner = penalty.parties.FirstOrDefault(p => p.type == "infOwner"); var affected = penalty.parties.Where(p => p.type == "affected").ToList(); if (affected != null && affected.Any()) { } var prtys = new List <Party> { infOwner }; foreach (var prty in prtys) { prty.CleanChildEntites(); } penalty.parties = prtys.ToArray(); // clean up of unneeded elements penalty.CleanParties(); return(penalty); }