Android Open Source - dandy Drupal Json Object Serializer






From Project

Back to project page dandy.

License

The source code is released under:

GNU General Public License

If you think the Android project dandy listed in this page is inappropriate, such as containing malicious code/tools or violating the copyright, please email info at java2s dot com, thanks.

Java Source Code

package org.workhabit.drupal.api.json;
/*from   w w  w.  j  a  v a2s .  c o  m*/
import com.google.gson.*;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import org.workhabit.drupal.api.entity.drupal7.DrupalNode;
import org.workhabit.drupal.api.entity.drupal7.DrupalField;
import org.workhabit.drupal.api.entity.drupal7.DrupalTaxonomyTerm;
import org.workhabit.drupal.api.site.exceptions.DrupalFetchException;

import java.util.*;

/**
 * Copyright 2009 - WorkHabit, Inc. - acs
 * Date: Oct 22, 2010, 10:51:49 AM
 */
public class DrupalJsonObjectSerializer<T> {
    private final Class<T> clazz;
    private final Gson gson;

    DrupalJsonObjectSerializer(Class<T> clazz) {
        this.clazz = clazz;
        GsonBuilder builder = new GsonBuilder();
        UnixTimeDateAdapter dateAdapter = new UnixTimeDateAdapter();
        builder.registerTypeAdapter(Date.class, dateAdapter);
        BooleanAdapter booleanAdapter = new BooleanAdapter();
        builder.registerTypeAdapter(Boolean.class, booleanAdapter);
        builder.setExclusionStrategies(new ExclusionStrategy() {

            public boolean shouldSkipField(FieldAttributes f) {
                return "taxonomy".equals(f.getName())
                       || "fields".equals(f.getName());
            }

            public boolean shouldSkipClass(Class<?> clazz) {
                return false;
            }
        });
        builder.setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES);
        gson = builder.create();
    }

    public String serialize(T object) throws JSONException {
        String json = gson.toJson(object);
        if (object.getClass() == DrupalNode.class) {
            DrupalNode n = (DrupalNode) object;
            Map<String, DrupalField> fieldMap = n.getFields();
            if (fieldMap != null && fieldMap.size() > 0) {
                // process any fields
                //
                JSONObject jsonObject = new JSONObject(json);
                for (Map.Entry<String, DrupalField> drupalFields : fieldMap.entrySet()) {
                    String name = drupalFields.getKey();
                    JSONObject jsonField = new JSONObject();
                    ArrayList<HashMap<String, String>> values = drupalFields.getValue().getValues();
                    for (int i = 0; i < values.size(); i++) {
                        JSONObject jsonValue = new JSONObject();
                        HashMap<String, String> value = values.get(i);
                        for (Map.Entry<String, String> entry : value.entrySet()) {
                            if (entry.getValue().startsWith("{")) {
                                // it's an object, try to deserialize
                                //
                                jsonValue.put(entry.getKey(), new JSONObject(entry.getValue()));
                            } else {
                                jsonValue.put(entry.getKey(), entry.getValue());
                            }
                        }
                        jsonField.put(String.valueOf(i), jsonValue);
                    }
                    jsonObject.put(name, jsonField);
                }
                json = jsonObject.toString();
            }
        }
        return json;
    }

    public T unserialize(String json) throws DrupalFetchException, JSONException {
        JSONObject dataObject = new JSONObject(json);
        T t = gson.fromJson(json, clazz);
        if (clazz == DrupalNode.class) {
            // special handling for cck fields.
            Iterator keys = dataObject.keys();
            Map<String, DrupalField> fields = new HashMap<String, DrupalField>();
            HashMap<Integer, DrupalTaxonomyTerm> terms = new HashMap<Integer, DrupalTaxonomyTerm>();
            while (keys.hasNext()) {
                String name = (String) keys.next();
                if (name.startsWith("field_")) {
                    // process cck field
                    //
                    DrupalField field = new DrupalField();
                    ArrayList<HashMap<String, String>> values = new ArrayList<HashMap<String, String>>();
                    JSONArray cckFieldArray = dataObject.getJSONArray(name);
                    for (int i = 0; i < cckFieldArray.length(); i++) {
                        if (cckFieldArray.isNull(i)) {
                            continue;
                        }
                        JSONObject o = cckFieldArray.getJSONObject(i);
                        field.setName(name);
                        Iterator objectKeys = o.keys();
                        HashMap<String, String> valueMap = new HashMap<String, String>();
                        while (objectKeys.hasNext()) {
                            String next = (String) objectKeys.next();
                            valueMap.put(next, o.getString(next));
                        }
                        values.add(valueMap);
                    }
                    field.setValues(values);
                    fields.put(field.getName(), field);
                } else if ("taxonomy".equals(name)) {
                    // handle serialization of Taxonomy differently than normal maps
                    Object taxonomy = dataObject.get("taxonomy");
                    if (taxonomy instanceof JSONArray) {
                        // empty
                    } else {
                        JSONObject taxonomyObject = (JSONObject) taxonomy;
                        Iterator iterator = taxonomyObject.keys();
                        DrupalJsonObjectSerializer<DrupalTaxonomyTerm> taxonomyTermDrupalJsonObjectSerializer = DrupalJsonObjectSerializerFactory.getInstance(DrupalTaxonomyTerm.class);
                        while (iterator.hasNext()) {
                            String next = (String) iterator.next();
                            JSONObject taxonomyTerm = taxonomyObject.getJSONObject(next);
                            DrupalTaxonomyTerm term = taxonomyTermDrupalJsonObjectSerializer.unserialize(taxonomyTerm.toString());
                            terms.put(term.getTid(), term);
                        }

                    }
                }

            }
            DrupalNode n = (DrupalNode) t;
            n.setFields(fields);
            n.setTaxonomy(terms);
        }
        return t;
    }

    private JSONObject extractDataObject(String json) throws JSONException, DrupalFetchException {
        JSONObject objectResult = new JSONObject(json);
        assertNoErrors(objectResult);
        if (objectResult.has("#data")) {
            return objectResult.getJSONObject("#data");
        }
        return objectResult;
    }

    public List<T> unserializeList(String json) throws DrupalFetchException, JSONException {
        JSONArray jsonArray = extractDataArray(json);
        List<T> list = new ArrayList<T>();
        for (int i = 0; i < jsonArray.length(); i++) {
            list.add(unserialize(jsonArray.getJSONObject(i).toString()));
        }
        return list;
    }

    private JSONArray extractDataArray(String json) throws JSONException {
        return new JSONArray(json);
    }

    private void assertNoErrors(JSONObject objectResult) throws JSONException, DrupalFetchException {
        if (objectResult.has("#error") && objectResult.getBoolean("#error")) {
            throw new DrupalFetchException(objectResult);
        }
    }
}




Java Source Code List

com.workhabit.drupal.publisher.AbstractDandyActivity.java
com.workhabit.drupal.publisher.AbstractDandyListActivity.java
com.workhabit.drupal.publisher.AbstractDrupalNodeListActivity.java
com.workhabit.drupal.publisher.DandyApplication.java
com.workhabit.drupal.publisher.DrupalHeadlineNodeListActivity.java
com.workhabit.drupal.publisher.DrupalLoginActivity.java
com.workhabit.drupal.publisher.DrupalNodeActivity.java
com.workhabit.drupal.publisher.DrupalNodeListViewActivity.java
com.workhabit.drupal.publisher.DrupalTaxonomyListActivity.java
com.workhabit.drupal.publisher.NewCommentActivity.java
com.workhabit.drupal.publisher.support.BottomNavClickHandler.java
com.workhabit.drupal.publisher.support.DrupalDialogHandler.java
com.workhabit.drupal.publisher.support.DrupalNodeArrayAdapter.java
com.workhabit.drupal.publisher.support.DrupalTaxonomyAdapter.java
org.workhabit.drupal.api.annotations.IdFieldName.java
org.workhabit.drupal.api.entity.drupal7.DrupalBody.java
org.workhabit.drupal.api.entity.drupal7.DrupalComment.java
org.workhabit.drupal.api.entity.drupal7.DrupalEntity.java
org.workhabit.drupal.api.entity.drupal7.DrupalField.java
org.workhabit.drupal.api.entity.drupal7.DrupalFile.java
org.workhabit.drupal.api.entity.drupal7.DrupalNode.java
org.workhabit.drupal.api.entity.drupal7.DrupalTaxonomyTerm.java
org.workhabit.drupal.api.entity.drupal7.DrupalUser.java
org.workhabit.drupal.api.entity.drupal7.ReadItLater.java
org.workhabit.drupal.api.json.BooleanAdapter.java
org.workhabit.drupal.api.json.DrupalFieldAdapter.java
org.workhabit.drupal.api.json.DrupalJsonObjectSerializerFactory.java
org.workhabit.drupal.api.json.DrupalJsonObjectSerializer.java
org.workhabit.drupal.api.json.UnixTimeDateAdapter.java
org.workhabit.drupal.api.site.CalendarFactory.java
org.workhabit.drupal.api.site.Drupal7SiteContext.java
org.workhabit.drupal.api.site.DrupalSiteContext.java
org.workhabit.drupal.api.site.NonceFactory.java
org.workhabit.drupal.api.site.exceptions.DrupalFetchException.java
org.workhabit.drupal.api.site.exceptions.DrupalLoginException.java
org.workhabit.drupal.api.site.exceptions.DrupalLogoutException.java
org.workhabit.drupal.api.site.exceptions.DrupalSaveException.java
org.workhabit.drupal.api.site.exceptions.DrupalServicesResponseException.java
org.workhabit.drupal.api.site.impl.DrupalSiteContextInstanceStateImpl.java
org.workhabit.drupal.api.site.impl.DrupalSiteContextInstanceState.java
org.workhabit.drupal.api.site.impl.v3.Drupal6SiteContextImpl.java
org.workhabit.drupal.api.site.impl.v3.Drupal7SiteContextImpl.java
org.workhabit.drupal.api.site.impl.v3.DrupalSiteContextBridge.java
org.workhabit.drupal.api.site.support.AndroidDrupalServicesRequestManagerImpl.java
org.workhabit.drupal.api.site.support.GenericCookie.java
org.workhabit.drupal.api.site.support.HttpUrlConnectionFactoryImpl.java
org.workhabit.drupal.api.site.support.HttpUrlConnectionFactory.java
org.workhabit.drupal.api.site.support.NonceFactoryImpl.java
org.workhabit.drupal.http.DrupalServicesRequestManager.java
org.workhabit.drupal.http.ServicesResponse.java