Example usage for com.fasterxml.jackson.core JsonParser getCurrentToken

List of usage examples for com.fasterxml.jackson.core JsonParser getCurrentToken

Introduction

In this page you can find the example usage for com.fasterxml.jackson.core JsonParser getCurrentToken.

Prototype

public abstract JsonToken getCurrentToken();

Source Link

Document

Accessor to find which token parser currently points to, if any; null will be returned if none.

Usage

From source file:com.msopentech.odatajclient.engine.metadata.edm.EntityTypeDeserializer.java

@Override
protected AbstractEntityType doDeserialize(final JsonParser jp, final DeserializationContext ctxt)
        throws IOException, JsonProcessingException {

    final AbstractEntityType entityType = ODataVersion.V3 == client.getWorkingVersion()
            ? new com.msopentech.odatajclient.engine.metadata.edm.v3.EntityType()
            : new com.msopentech.odatajclient.engine.metadata.edm.v4.EntityType();

    for (; jp.getCurrentToken() != JsonToken.END_OBJECT; jp.nextToken()) {
        final JsonToken token = jp.getCurrentToken();
        if (token == JsonToken.FIELD_NAME) {
            if ("Name".equals(jp.getCurrentName())) {
                entityType.setName(jp.nextTextValue());
            } else if ("Abstract".equals(jp.getCurrentName())) {
                entityType.setAbstractEntityType(BooleanUtils.toBoolean(jp.nextTextValue()));
            } else if ("BaseType".equals(jp.getCurrentName())) {
                entityType.setBaseType(jp.nextTextValue());
            } else if ("OpenType".equals(jp.getCurrentName())) {
                entityType.setOpenType(BooleanUtils.toBoolean(jp.nextTextValue()));
            } else if ("HasStream".equals(jp.getCurrentName())) {
                entityType.setHasStream(BooleanUtils.toBoolean(jp.nextTextValue()));
            } else if ("Key".equals(jp.getCurrentName())) {
                jp.nextToken();/*w w w .  j  av  a  2  s  .  c o  m*/
                entityType.setKey(jp.getCodec().readValue(jp, EntityKey.class));
            } else if ("Property".equals(jp.getCurrentName())) {
                jp.nextToken();
                if (entityType instanceof com.msopentech.odatajclient.engine.metadata.edm.v3.EntityType) {
                    ((com.msopentech.odatajclient.engine.metadata.edm.v3.EntityType) entityType).getProperties()
                            .add(jp.getCodec().readValue(jp,
                                    com.msopentech.odatajclient.engine.metadata.edm.v3.Property.class));
                } else {
                    ((com.msopentech.odatajclient.engine.metadata.edm.v4.EntityType) entityType).getProperties()
                            .add(jp.getCodec().readValue(jp,
                                    com.msopentech.odatajclient.engine.metadata.edm.v4.Property.class));
                }
            } else if ("NavigationProperty".equals(jp.getCurrentName())) {
                jp.nextToken();
                if (entityType instanceof com.msopentech.odatajclient.engine.metadata.edm.v3.EntityType) {
                    ((com.msopentech.odatajclient.engine.metadata.edm.v3.EntityType) entityType)
                            .getNavigationProperties().add(jp.getCodec().readValue(jp,
                                    com.msopentech.odatajclient.engine.metadata.edm.v3.NavigationProperty.class));
                } else {
                    ((com.msopentech.odatajclient.engine.metadata.edm.v4.EntityType) entityType)
                            .getNavigationProperties().add(jp.getCodec().readValue(jp,
                                    com.msopentech.odatajclient.engine.metadata.edm.v4.NavigationProperty.class));
                }
            } else if ("Annotation".equals(jp.getCurrentName())) {
                jp.nextToken();
                ((com.msopentech.odatajclient.engine.metadata.edm.v4.EntityType) entityType)
                        .setAnnotation(jp.getCodec().readValue(jp, Annotation.class));
            }
        }
    }

    return entityType;
}

From source file:com.google.openrtb.json.AbstractOpenRtbJsonReader.java

/**
 * Read any extensions that may exist in a message.
 *
 * @param msg Builder of a message that may contain extensions
 * @param par The JSON parser, positioned at the "ext" field
 * @param <EB> Type of message builder being constructed
 * @throws IOException any parsing error
 *///from ww  w.  j a v  a 2s.  c o  m
protected final <EB extends ExtendableBuilder<?, EB>> void readExtensions(EB msg, JsonParser par)
        throws IOException {
    @SuppressWarnings("unchecked")
    Set<OpenRtbJsonExtReader<EB>> extReaders = factory.getReaders((Class<EB>) msg.getClass());
    if (extReaders.isEmpty()) {
        par.skipChildren();
        return;
    }

    startObject(par);
    JsonToken tokLast = par.getCurrentToken();
    JsonLocation locLast = par.getCurrentLocation();

    while (true) {
        boolean extRead = false;
        for (OpenRtbJsonExtReader<EB> extReader : extReaders) {
            if (extReader.filter(par)) {
                extReader.read(msg, par);
                JsonToken tokNew = par.getCurrentToken();
                JsonLocation locNew = par.getCurrentLocation();
                boolean advanced = tokNew != tokLast || !locNew.equals(locLast);
                extRead |= advanced;

                if (!endObject(par)) {
                    return;
                } else if (advanced && par.getCurrentToken() != JsonToken.FIELD_NAME) {
                    tokLast = par.nextToken();
                    locLast = par.getCurrentLocation();
                } else {
                    tokLast = tokNew;
                    locLast = locNew;
                }
            }
        }

        if (!endObject(par)) {
            // Can't rely on this exit condition inside the for loop because no readers may filter.
            return;
        }

        if (!extRead) {
            // No field was consumed by any reader, so we need to skip the field to make progress.
            if (logger.isDebugEnabled()) {
                logger.debug("Extension field not consumed by any reader, skipping: {} @{}:{}",
                        par.getCurrentName(), locLast.getLineNr(), locLast.getCharOffset());
            }
            par.nextToken();
            par.skipChildren();
            tokLast = par.nextToken();
            locLast = par.getCurrentLocation();
        }
        // Else loop, try all readers again
    }
}

From source file:com.msopentech.odatajclient.engine.data.metadata.edm.EntityTypeDeserializer.java

@Override
protected AbstractEntityType doDeserialize(final JsonParser jp, final DeserializationContext ctxt)
        throws IOException, JsonProcessingException {

    final AbstractEntityType entityType = ODataVersion.V3 == client.getWorkingVersion()
            ? new com.msopentech.odatajclient.engine.data.metadata.edm.v3.EntityType()
            : new com.msopentech.odatajclient.engine.data.metadata.edm.v4.EntityType();

    for (; jp.getCurrentToken() != JsonToken.END_OBJECT; jp.nextToken()) {
        final JsonToken token = jp.getCurrentToken();
        if (token == JsonToken.FIELD_NAME) {
            if ("Name".equals(jp.getCurrentName())) {
                entityType.setName(jp.nextTextValue());
            } else if ("Abstract".equals(jp.getCurrentName())) {
                entityType.setAbstractEntityType(BooleanUtils.toBoolean(jp.nextTextValue()));
            } else if ("BaseType".equals(jp.getCurrentName())) {
                entityType.setBaseType(jp.nextTextValue());
            } else if ("OpenType".equals(jp.getCurrentName())) {
                entityType.setOpenType(BooleanUtils.toBoolean(jp.nextTextValue()));
            } else if ("HasStream".equals(jp.getCurrentName())) {
                entityType.setHasStream(BooleanUtils.toBoolean(jp.nextTextValue()));
            } else if ("Key".equals(jp.getCurrentName())) {
                jp.nextToken();/*  ww w.  ja  va2s.  c  om*/
                entityType.setKey(jp.getCodec().readValue(jp, EntityKey.class));
            } else if ("Property".equals(jp.getCurrentName())) {
                jp.nextToken();
                if (entityType instanceof com.msopentech.odatajclient.engine.data.metadata.edm.v3.EntityType) {
                    ((com.msopentech.odatajclient.engine.data.metadata.edm.v3.EntityType) entityType)
                            .getProperties().add(jp.getCodec().readValue(jp,
                                    com.msopentech.odatajclient.engine.data.metadata.edm.v3.Property.class));
                } else {
                    ((com.msopentech.odatajclient.engine.data.metadata.edm.v4.EntityType) entityType)
                            .getProperties().add(jp.getCodec().readValue(jp,
                                    com.msopentech.odatajclient.engine.data.metadata.edm.v4.Property.class));
                }
            } else if ("NavigationProperty".equals(jp.getCurrentName())) {
                jp.nextToken();
                if (entityType instanceof com.msopentech.odatajclient.engine.data.metadata.edm.v3.EntityType) {
                    ((com.msopentech.odatajclient.engine.data.metadata.edm.v3.EntityType) entityType)
                            .getNavigationProperties().add(jp.getCodec().readValue(jp,
                                    com.msopentech.odatajclient.engine.data.metadata.edm.v3.NavigationProperty.class));
                } else {
                    ((com.msopentech.odatajclient.engine.data.metadata.edm.v4.EntityType) entityType)
                            .getNavigationProperties().add(jp.getCodec().readValue(jp,
                                    com.msopentech.odatajclient.engine.data.metadata.edm.v4.NavigationProperty.class));
                }
            } else if ("Annotation".equals(jp.getCurrentName())) {
                jp.nextToken();
                ((com.msopentech.odatajclient.engine.data.metadata.edm.v4.EntityType) entityType)
                        .setAnnotation(jp.getCodec().readValue(jp, Annotation.class));
            }
        }
    }

    return entityType;
}

From source file:org.gvnix.web.json.DataBinderDeserializer.java

/**
 * Deserializes JSON content into Map<String, String> format and then uses a
 * Spring {@link DataBinder} to bind the data from JSON message to JavaBean
 * objects.//from  ww w .  j a v a 2  s.c o  m
 * <p/>
 * It is a workaround for issue
 * https://jira.springsource.org/browse/SPR-6731 that should be removed from
 * next gvNIX releases when that issue will be resolved.
 * 
 * @param parser Parsed used for reading JSON content
 * @param ctxt Context that can be used to access information about this
 *        deserialization activity.
 * 
 * @return Deserializer value
 */
@SuppressWarnings({ "rawtypes", "unchecked" })
@Override
public Object deserialize(JsonParser parser, DeserializationContext ctxt)
        throws IOException, JsonProcessingException {
    JsonToken t = parser.getCurrentToken();
    MutablePropertyValues propertyValues = new MutablePropertyValues();

    // Get target from DataBinder from local thread. If its a bean
    // collection
    // prepares array index for property names. Otherwise continue.
    DataBinder binder = (DataBinder) ThreadLocalUtil
            .getThreadVariable(BindingResult.MODEL_KEY_PREFIX.concat("JSON_DataBinder"));
    Object target = binder.getTarget();

    // For DstaBinderList instances, contentTarget contains the final bean
    // for binding. DataBinderList is just a simple wrapper to deserialize
    // bean wrapper using DataBinder
    Object contentTarget = null;

    if (t == JsonToken.START_OBJECT) {
        String prefix = null;
        if (target instanceof DataBinderList) {
            prefix = binder.getObjectName().concat("[").concat(Integer.toString(((Collection) target).size()))
                    .concat("].");

            // BeanWrapperImpl cannot create new instances if generics
            // don't specify content class, so do it by hand
            contentTarget = BeanUtils.instantiateClass(((DataBinderList) target).getContentClass());
            ((Collection) target).add(contentTarget);
        } else if (target instanceof Map) {
            // TODO
            LOGGER.warn("Map deserialization not implemented yet!");
        }
        Map<String, String> obj = readObject(parser, ctxt, prefix);
        propertyValues.addPropertyValues(obj);
    } else {
        LOGGER.warn("Deserialization for non-object not implemented yet!");
        return null; // TODO?
    }

    // bind to the target object
    binder.bind(propertyValues);

    // Note there is no need to validate the target object because
    // RequestResponseBodyMethodProcessor.resolveArgument() does it on top
    // of including BindingResult as Model attribute

    // For DAtaBinderList the contentTarget contains the final bean to
    // make the binding, so we must return it
    if (contentTarget != null) {
        return contentTarget;
    }
    return binder.getTarget();
}

From source file:org.elasticsearch.client.sniff.ElasticsearchHostsSniffer.java

private List<HttpHost> readHosts(HttpEntity entity) throws IOException {
    try (InputStream inputStream = entity.getContent()) {
        JsonParser parser = jsonFactory.createParser(inputStream);
        if (parser.nextToken() != JsonToken.START_OBJECT) {
            throw new IOException("expected data to start with an object");
        }//from   w ww. j a va 2 s . c  o  m
        List<HttpHost> hosts = new ArrayList<>();
        while (parser.nextToken() != JsonToken.END_OBJECT) {
            if (parser.getCurrentToken() == JsonToken.START_OBJECT) {
                if ("nodes".equals(parser.getCurrentName())) {
                    while (parser.nextToken() != JsonToken.END_OBJECT) {
                        JsonToken token = parser.nextToken();
                        assert token == JsonToken.START_OBJECT;
                        String nodeId = parser.getCurrentName();
                        HttpHost sniffedHost = readHost(nodeId, parser, this.scheme);
                        if (sniffedHost != null) {
                            logger.trace("adding node [" + nodeId + "]");
                            hosts.add(sniffedHost);
                        }
                    }
                } else {
                    parser.skipChildren();
                }
            }
        }
        return hosts;
    }
}

From source file:org.apache.ode.jacob.soup.jackson.MessageDeserializer.java

@Override
public Message deserialize(JsonParser jp, DeserializationContext ctxt)
        throws IOException, JsonProcessingException {

    long id = 0;/*from ww  w.  j ava 2s .c  o m*/
    String action = null;
    ChannelRef to = null;
    ChannelRef replyTo = null;
    Map<String, Object> headers = null;
    Object body = null;

    while (jp.nextToken() != JsonToken.END_OBJECT) {
        String fieldname = jp.getCurrentName();
        if (jp.getCurrentToken() == JsonToken.FIELD_NAME) {
            // if we're not already on the field, advance by one.
            jp.nextToken();
        }

        if ("id".equals(fieldname)) {
            id = jp.getLongValue();
        } else if ("action".equals(fieldname)) {
            action = jp.getText();
        } else if ("to".equals(fieldname)) {
            to = jp.readValueAs(ChannelRef.class);
        } else if ("replyTo".equals(fieldname)) {
            replyTo = jp.readValueAs(ChannelRef.class);
        } else if ("headers".equals(fieldname)) {
            headers = jp.readValueAs(mapTypeRef);
        } else if ("body".equals(fieldname)) {
            body = jp.readValueAs(Object.class);
        }
    }

    if (action == null) {
        throw ctxt.mappingException(Message.class);
    }

    if (to == null) {
        throw ctxt.mappingException(Message.class);
    }

    Message msg = new Message(to, replyTo, action);
    msg.setHeaders(headers);
    msg.setBody(body);
    msg.setId(id);

    return msg;
}

From source file:com.msopentech.odatajclient.engine.metadata.edm.EntityContainerDeserializer.java

@Override
protected AbstractEntityContainer doDeserialize(final JsonParser jp, final DeserializationContext ctxt)
        throws IOException, JsonProcessingException {

    final AbstractEntityContainer entityContainer = ODataVersion.V3 == client.getWorkingVersion()
            ? new com.msopentech.odatajclient.engine.metadata.edm.v3.EntityContainer()
            : new com.msopentech.odatajclient.engine.metadata.edm.v4.EntityContainer();

    for (; jp.getCurrentToken() != JsonToken.END_OBJECT; jp.nextToken()) {
        final JsonToken token = jp.getCurrentToken();
        if (token == JsonToken.FIELD_NAME) {
            if ("Name".equals(jp.getCurrentName())) {
                entityContainer.setName(jp.nextTextValue());
            } else if ("Extends".equals(jp.getCurrentName())) {
                entityContainer.setExtends(jp.nextTextValue());
            } else if ("LazyLoadingEnabled".equals(jp.getCurrentName())) {
                entityContainer.setLazyLoadingEnabled(BooleanUtils.toBoolean(jp.nextTextValue()));
            } else if ("IsDefaultEntityContainer".equals(jp.getCurrentName())) {
                entityContainer.setDefaultEntityContainer(BooleanUtils.toBoolean(jp.nextTextValue()));
            } else if ("EntitySet".equals(jp.getCurrentName())) {
                jp.nextToken();/*from   w w  w.j  a va2 s. c om*/
                if (entityContainer instanceof com.msopentech.odatajclient.engine.metadata.edm.v3.EntityContainer) {
                    ((com.msopentech.odatajclient.engine.metadata.edm.v3.EntityContainer) entityContainer)
                            .getEntitySets().add(jp.getCodec().readValue(jp,
                                    com.msopentech.odatajclient.engine.metadata.edm.v3.EntitySet.class));
                } else {
                    ((com.msopentech.odatajclient.engine.metadata.edm.v4.EntityContainer) entityContainer)
                            .getEntitySets().add(jp.getCodec().readValue(jp,
                                    com.msopentech.odatajclient.engine.metadata.edm.v4.EntitySet.class));
                }
            } else if ("AssociationSet".equals(jp.getCurrentName())) {
                jp.nextToken();
                ((com.msopentech.odatajclient.engine.metadata.edm.v3.EntityContainer) entityContainer)
                        .getAssociationSets().add(jp.getCodec().readValue(jp, AssociationSet.class));
            } else if ("Singleton".equals(jp.getCurrentName())) {
                jp.nextToken();
                ((com.msopentech.odatajclient.engine.metadata.edm.v4.EntityContainer) entityContainer)
                        .getSingletons().add(jp.getCodec().readValue(jp, Singleton.class));
            } else if ("ActionImport".equals(jp.getCurrentName())) {
                jp.nextToken();
                ((com.msopentech.odatajclient.engine.metadata.edm.v4.EntityContainer) entityContainer)
                        .getActionImports().add(jp.getCodec().readValue(jp, ActionImport.class));
            } else if ("FunctionImport".equals(jp.getCurrentName())) {
                jp.nextToken();
                if (entityContainer instanceof com.msopentech.odatajclient.engine.metadata.edm.v3.EntityContainer) {
                    ((com.msopentech.odatajclient.engine.metadata.edm.v3.EntityContainer) entityContainer)
                            .getFunctionImports().add(jp.getCodec().readValue(jp,
                                    com.msopentech.odatajclient.engine.metadata.edm.v3.FunctionImport.class));
                } else {
                    ((com.msopentech.odatajclient.engine.metadata.edm.v4.EntityContainer) entityContainer)
                            .getFunctionImports().add(jp.getCodec().readValue(jp,
                                    com.msopentech.odatajclient.engine.metadata.edm.v4.FunctionImport.class));
                }
            } else if ("Annotation".equals(jp.getCurrentName())) {
                jp.nextToken();
                ((com.msopentech.odatajclient.engine.metadata.edm.v4.EntityContainer) entityContainer)
                        .setAnnotation(jp.getCodec().readValue(jp, Annotation.class));
            }
        }
    }

    return entityContainer;
}

From source file:com.msopentech.odatajclient.engine.data.metadata.edm.EntityContainerDeserializer.java

@Override
protected AbstractEntityContainer doDeserialize(final JsonParser jp, final DeserializationContext ctxt)
        throws IOException, JsonProcessingException {

    final AbstractEntityContainer entityContainer = ODataVersion.V3 == client.getWorkingVersion()
            ? new com.msopentech.odatajclient.engine.data.metadata.edm.v3.EntityContainer()
            : new com.msopentech.odatajclient.engine.data.metadata.edm.v4.EntityContainer();

    for (; jp.getCurrentToken() != JsonToken.END_OBJECT; jp.nextToken()) {
        final JsonToken token = jp.getCurrentToken();
        if (token == JsonToken.FIELD_NAME) {
            if ("Name".equals(jp.getCurrentName())) {
                entityContainer.setName(jp.nextTextValue());
            } else if ("Extends".equals(jp.getCurrentName())) {
                entityContainer.setExtends(jp.nextTextValue());
            } else if ("LazyLoadingEnabled".equals(jp.getCurrentName())) {
                entityContainer.setLazyLoadingEnabled(BooleanUtils.toBoolean(jp.nextTextValue()));
            } else if ("IsDefaultEntityContainer".equals(jp.getCurrentName())) {
                entityContainer.setDefaultEntityContainer(BooleanUtils.toBoolean(jp.nextTextValue()));
            } else if ("EntitySet".equals(jp.getCurrentName())) {
                jp.nextToken();/*from  w  w w.  j  a v a2s  .c  om*/
                if (entityContainer instanceof com.msopentech.odatajclient.engine.data.metadata.edm.v3.EntityContainer) {
                    ((com.msopentech.odatajclient.engine.data.metadata.edm.v3.EntityContainer) entityContainer)
                            .getEntitySets().add(jp.getCodec().readValue(jp,
                                    com.msopentech.odatajclient.engine.data.metadata.edm.v3.EntitySet.class));
                } else {
                    ((com.msopentech.odatajclient.engine.data.metadata.edm.v4.EntityContainer) entityContainer)
                            .getEntitySets().add(jp.getCodec().readValue(jp,
                                    com.msopentech.odatajclient.engine.data.metadata.edm.v4.EntitySet.class));
                }
            } else if ("AssociationSet".equals(jp.getCurrentName())) {
                jp.nextToken();
                ((com.msopentech.odatajclient.engine.data.metadata.edm.v3.EntityContainer) entityContainer)
                        .getAssociationSets().add(jp.getCodec().readValue(jp, AssociationSet.class));
            } else if ("Singleton".equals(jp.getCurrentName())) {
                jp.nextToken();
                ((com.msopentech.odatajclient.engine.data.metadata.edm.v4.EntityContainer) entityContainer)
                        .getSingletons().add(jp.getCodec().readValue(jp, Singleton.class));
            } else if ("ActionImport".equals(jp.getCurrentName())) {
                jp.nextToken();
                ((com.msopentech.odatajclient.engine.data.metadata.edm.v4.EntityContainer) entityContainer)
                        .getActionImports().add(jp.getCodec().readValue(jp, ActionImport.class));
            } else if ("FunctionImport".equals(jp.getCurrentName())) {
                jp.nextToken();
                if (entityContainer instanceof com.msopentech.odatajclient.engine.data.metadata.edm.v3.EntityContainer) {
                    ((com.msopentech.odatajclient.engine.data.metadata.edm.v3.EntityContainer) entityContainer)
                            .getFunctionImports().add(jp.getCodec().readValue(jp,
                                    com.msopentech.odatajclient.engine.data.metadata.edm.v3.FunctionImport.class));
                } else {
                    ((com.msopentech.odatajclient.engine.data.metadata.edm.v4.EntityContainer) entityContainer)
                            .getFunctionImports().add(jp.getCodec().readValue(jp,
                                    com.msopentech.odatajclient.engine.data.metadata.edm.v4.FunctionImport.class));
                }
            } else if ("Annotation".equals(jp.getCurrentName())) {
                jp.nextToken();
                ((com.msopentech.odatajclient.engine.data.metadata.edm.v4.EntityContainer) entityContainer)
                        .setAnnotation(jp.getCodec().readValue(jp, Annotation.class));
            }
        }
    }

    return entityContainer;
}

From source file:org.mongojack.internal.object.BsonObjectGenerator.java

@Override
public void copyCurrentStructure(JsonParser jp) throws IOException {
    JsonToken t = jp.getCurrentToken();

    // Let'string handle field-name separately first
    if (t == JsonToken.FIELD_NAME) {
        writeFieldName(jp.getCurrentName());
        t = jp.nextToken();//from  www . j a  v a 2 s.  com
        // fall-through to copy the associated value
    }

    switch (t) {
    case START_ARRAY:
        writeStartArray();
        while (jp.nextToken() != JsonToken.END_ARRAY) {
            copyCurrentStructure(jp);
        }
        writeEndArray();
        break;
    case START_OBJECT:
        writeStartObject();
        while (jp.nextToken() != JsonToken.END_OBJECT) {
            copyCurrentStructure(jp);
        }
        writeEndObject();
        break;
    default: // others are simple:
        copyCurrentEvent(jp);
    }
}

From source file:com.adobe.communities.ugc.migration.importer.MessagesImportServlet.java

private void importMessages(final SlingHttpServletRequest request, final JsonParser jsonParser,
        final Map<String, Object> messageModifiers) throws ServletException {

    if (!jsonParser.getCurrentToken().equals(JsonToken.START_ARRAY)) {
        throw new ServletException("unexpected starting token " + jsonParser.getCurrentToken().asString());
    }/* w  w w .  j a va2  s .  c om*/

    try {
        jsonParser.nextToken(); //presumably, we will advance to a "start object" token
        while (!jsonParser.getCurrentToken().equals(JsonToken.END_ARRAY)) {
            final Map<String, Map<String, Boolean>> recipientModifiers = new HashMap<String, Map<String, Boolean>>();
            final Map<String, Object> props = new HashMap<String, Object>();
            final Map<String, Object> messageModifier = new HashMap<String, Object>();
            List<FileDataSource> attachments = new ArrayList<FileDataSource>();
            String sender = "";
            jsonParser.nextToken(); //field name
            while (!jsonParser.getCurrentToken().equals(JsonToken.END_OBJECT)) {
                final String fieldName = jsonParser.getCurrentName();
                jsonParser.nextToken(); //value
                if (fieldName.equals("senderId")) {
                    sender = URLDecoder.decode(jsonParser.getValueAsString(), "UTF-8");
                } else if (fieldName.equals("added")) {
                    final Calendar calendar = new GregorianCalendar();
                    calendar.setTimeInMillis(jsonParser.getLongValue());
                    messageModifier.put("added", calendar);
                } else if (fieldName.equals("recipients")) {
                    // build the string for the "to" property and also create the modifiers we'll need later
                    final StringBuilder recipientString = new StringBuilder();
                    //iterate over each key (each being a recipient id)
                    if (jsonParser.getCurrentToken().equals(JsonToken.START_OBJECT)) {
                        jsonParser.nextToken(); // should get first recipientId
                        while (!jsonParser.getCurrentToken().equals(JsonToken.END_OBJECT)) {
                            final String recipientId = jsonParser.getCurrentName();
                            jsonParser.nextToken(); //start object
                            jsonParser.nextToken(); //first label
                            final Map<String, Boolean> interactionModifiers = new HashMap<String, Boolean>();
                            while (!jsonParser.getCurrentToken().equals(JsonToken.END_OBJECT)) {
                                final String label = jsonParser.getCurrentName();
                                jsonParser.nextToken();
                                final Boolean labelValue = jsonParser.getBooleanValue();
                                interactionModifiers.put(label, labelValue);
                                jsonParser.nextToken(); //next label or end object
                            }
                            try {
                                final String userPath = userPropertiesService.getAuthorizablePath(recipientId);
                                recipientModifiers.put(userPath, interactionModifiers);
                                recipientString.append(recipientId);
                            } catch (final RepositoryException e) {
                                // log the fact that a recipient specified in the json file doesn't exist in this
                                // environment
                                throw new ServletException(
                                        "A recipient specified in the migration file couldn't "
                                                + "be found in this environment",
                                        e);
                            }
                            jsonParser.nextToken(); // next recipientId or end object
                            if (jsonParser.getCurrentToken().equals(JsonToken.FIELD_NAME)) {
                                recipientString.append(';');
                            }
                        }
                        props.put("to", recipientString);
                        messageModifier.put("recipientDetails", recipientModifiers);
                    }
                } else if (fieldName.equals(ContentTypeDefinitions.LABEL_ATTACHMENTS)) {
                    UGCImportHelper.getAttachments(jsonParser, attachments);
                } else {
                    props.put(fieldName, URLDecoder.decode(jsonParser.getValueAsString(), "UTF-8"));
                }
                jsonParser.nextToken(); //either next field name or end object
            }
            final Random range = new Random();
            final String key = String.valueOf(range.nextInt(Integer.MAX_VALUE))
                    + String.valueOf(range.nextInt(Integer.MAX_VALUE));
            // we're going to temporarily overwrite the subject (to do a search) and need to track its initial value
            if (props.containsKey("subject")) {
                messageModifier.put("subject", props.get("subject"));
            } else {
                messageModifier.put("subject", "");
            }
            props.put("subject", key); //use subject as the search key
            messageModifiers.put(key, messageModifier);
            try {
                short result = messagingService.create(request.getResourceResolver(), request.getResource(),
                        sender, props, attachments,
                        clientUtilsFactory.getClientUtilities(xss, request, socialUtils));

                if (result != 200) {
                    throw new ServletException("Message sending failed. Return code was " + result);
                }
            } catch (final OperationException e) {
                throw new ServletException("Unable to create a message through the operation service", e);
            }
            jsonParser.nextToken(); //either END_ARRAY or START_OBJECT
        }

    } catch (final IOException e) {
        throw new ServletException("Encountered exception while parsing json content", e);
    }
}