/// <summary> /// Deserializes Event object with it's proper event detail. /// Requires the xmlString which is used for the deserialization /// </summary> public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { try { JObject obj = JObject.Load(reader); Object root = null; if (xmlString != null) { //-- Deserializing Event without detail XmlDocument xD = new XmlDocument(); xD.LoadXml(xmlString); string eventString = ""; foreach (XmlNode child in xD.ChildNodes) { if (child.Name == "emlc:Event") { eventString = child.OuterXml; break; } } xD.LoadXml(eventString); XmlSerializer xmlSerializer = new XmlSerializer(typeof(Event)); StringReader xmlReader = new StringReader(eventString); Event myEvent = (Event)xmlSerializer.Deserialize(xmlReader); //-- Deserializing EventDetails if it exists JToken incTok = obj.SelectToken("emlc:Event.emlc:IncidentDetail"); JToken resTok = obj.SelectToken("emlc:Event.emlc:ResourceDetail"); JToken maTok = obj.SelectToken("emlc:Event.maid:MutualAidDetail"); JToken infTok = obj.SelectToken("emlc:Event.emlc:InfrastructureDetail"); if (incTok != null) // If Details is an IncidentDetail { string elementName = "emlc:IncidentDetail"; Type detailType = typeof(IncidentDetail); string detailXML = ""; // Getting XML for just this detail foreach (XmlNode child in xD.FirstChild.ChildNodes) { if (child.Name == elementName) { detailXML = child.OuterXml; break; } } // Deserializing XmlSerializer detailSerializer = new XmlSerializer(detailType); StringReader detailReader = new StringReader(detailXML); IncidentDetail myDetail = (IncidentDetail)detailSerializer.Deserialize(detailReader); myEvent.Details = myDetail; } else if (resTok != null) // If Details is a ResourceDetail { Type detailType = typeof(ResourceDetail); JToken detailToken = resTok; string elementName = "emlc:ResourceDetail"; string detailXML = ""; // Getting XML for just this detail foreach (XmlNode child in xD.FirstChild.ChildNodes) { if (child.Name == elementName) { detailXML = child.OuterXml; break; } } // Deserializing XmlSerializer detailSerializer = new XmlSerializer(detailType); StringReader detailReader = new StringReader(detailXML); ResourceDetail myDetail = (ResourceDetail)detailSerializer.Deserialize(detailReader); myEvent.Details = myDetail; } else if (infTok != null) // If Details is an InfrastructureDetail { Type detailType = typeof(InfrastructureDetail); JToken detailToken = infTok; string elementName = "emlc:InfrastructureDetail"; string detailXML = ""; // Getting XML for just this detail foreach (XmlNode child in xD.FirstChild.ChildNodes) { if (child.Name == elementName) { detailXML = child.OuterXml; break; } } // Deserializing XmlSerializer detailSerializer = new XmlSerializer(detailType); StringReader detailReader = new StringReader(detailXML); InfrastructureDetail myDetail = (InfrastructureDetail)detailSerializer.Deserialize(detailReader); myEvent.Details = myDetail; } else if (maTok != null) // If Details is a MutualAidDetail { JToken detailToken = maTok; string elementName = "maid:MutualAidDetail"; string detailXML = ""; // Getting XML for just this detail foreach (XmlNode child in xD.FirstChild.ChildNodes) { if (child.Name == elementName) { detailXML = child.OuterXml; break; } } // Deserializing Mutual Aid Detail (requires MA Converter) string json = detailToken.ToString(); NIEMUtil.setDefaultDeseralizeSetting(); MutualAidDetail myDetail = JsonConvert.DeserializeObject <MutualAidDetail>(json, new JsonConverter[] { new deserialMAConvert(detailXML) }); myEvent.Details = myDetail; } else { throw new JsonSerializationException("XML string must be specified"); } return(myEvent); } } catch (Exception e) { string r = e.ToString(); } return(null); }
public Event(InfrastructureDetail det) : this() { this.Details = det; }