public override string ProcessEventData(TheThing thing, object evnt, DateTimeOffset defaultTimestamp)
 {
     string error = null;
     string json = DecodeEventAsString(evnt);
     if (json == null)
     {
         error = "Invalid payload";
     }
     else
     {
         MeasurementPayload payload = null;
         try
         {
             payload = TheCommonUtils.DeserializeJSONStringToObject<MeasurementPayload>(json);
             if (payload == null)
             {
                 error = "No data in payload";
             }
             else
             {
                 // TODO Implement deserializer (not customer requirement at this point)
             }
         }
         catch (Exception e)
         {
             error = e.ToString();
         }
     }
     return error;
 }
        string SerializeJSonArray(TheThingStore thingEvent, IEnumerable<Measurement> measurements)
        {
            if (!(measurements is List<Measurement>))
            {
                measurements = new List<Measurement>(measurements);
            }

            var payload = new MeasurementPayload();

            object deviceId;
            if (thingEvent.PB.TryGetValue("deviceID", out deviceId))
            {
                payload.device.deviceID = TheCommonUtils.CStr(deviceId);
            }
            else
            {
                payload.device.deviceID = TheCommonUtils.cdeGuidToString(thingEvent.cdeMID);
            }
            payload.measurements.AddRange(measurements);

            string eventPayloadJson = TheCommonUtils.SerializeObjectToJSONString(payload);
            //eventPayloadJson = eventPayloadJson.Replace("\"contentspec\"", "\"content-spec\""); // Hack to avoid newtonsoft dependency for now: attribute ignored by cdeEngine internal serializer
            return eventPayloadJson;
        }