private JNode DataToJNode(StructuralAspect aspect) {
      var jn = new JNode();
      var stype = aspect.StructuralType;

      stype.DataProperties.ForEach(dp => {
        var val = aspect.GetValue(dp.Name);
        // handle nonscalar dps
        if (dp.IsComplexProperty) {
          jn.AddJNode(dp.NameOnServer, DataToJNode(((IComplexObject)val).ComplexAspect));
        } else {
          jn.AddPrimitive(dp.NameOnServer, val, dp.DefaultValue);
        }
      });
      return jn;
    }
 private JNode BuildOriginalValuesMapNode(StructuralAspect aspect, NamingConvention nc) {
   var stType = aspect.StructuralType;
   var ovMap = aspect.OriginalValuesMap.ToDictionary(
     kvp => stType.GetProperty(kvp.Key).NameOnServer, 
     kvp => kvp.Value);      
   var cps = stType.ComplexProperties;        
   cps.ForEach(cp => {
     var co = aspect.GetValue(cp.Name);
     var serverName = cp.NameOnServer;
     if (cp.IsScalar) {
       var ovmNode = BuildOriginalValuesMapNode( ((IComplexObject) co).ComplexAspect, nc);
       ovMap[serverName] = ovmNode;
     } else {
       var ovmNodes = ((IEnumerable) co).Cast<IComplexObject>().Select(co2 => BuildOriginalValuesMapNode(co2.ComplexAspect, nc));
       ovMap[serverName] = JNode.ToJArray(ovmNodes);
     }
   });
   var result = JNode.BuildMapNode(ovMap);
   return result;
 }