private Data toData(JsonParser jp) throws IOException {
      JsonToken ntoken = jp.getCurrentToken();
      if (ntoken == JsonToken.START_ARRAY) {
         Data d = Data.list();
         while (JsonToken.END_ARRAY != jp.nextToken()) {
            d.add(toData(jp));
         }
         return d;
      } else if (ntoken == JsonToken.START_OBJECT) {
         Data d = Data.map();
         while (JsonToken.END_OBJECT != jp.nextToken()) {
            String k = jp.getCurrentName();
            jp.nextToken();
            d.put(k, toData(jp));
         }
         return d;
      } else if (ntoken == JsonToken.VALUE_STRING) {
         return Data.data(jp.getValueAsString());
      } else if (ntoken == JsonToken.VALUE_NUMBER_INT) {
         return Data.data(jp.getValueAsLong());
      } else if (ntoken == JsonToken.VALUE_NUMBER_FLOAT) {
         return Data.data(jp.getValueAsDouble());
      } else if (ntoken == JsonToken.VALUE_FALSE ||
                 ntoken == JsonToken.VALUE_TRUE) {
         return Data.data(jp.getValueAsBoolean());
      }
      return null;
   }