Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to prevent Gson serialize / deserialize the first character of a field (underscore)?

Tags:

json

parsing

gson

My class:

class ExampleBean {
   private String _firstField;
   private String _secondField;
   // respective getters and setters
}

I want to appear as follows:

{
     "FirstField":"value",
     "SecondField":"value"
}

And not like this

{
     "_FirstField":"value",
     "_SecondField":"value"
}

I initialize the parser as follows:

GsonBuilder builder = new GsonBuilder();
    builder.setDateFormat(DateFormat.LONG);
    builder.setFieldNamingPolicy(FieldNamingPolicy.UPPER_CAMEL_CASE);
    builder.setPrettyPrinting();
    set_defaultParser(builder.create());

I could see the API and in the documentation of "FieldNamePolicy" but I am surprised that not give the option to skip "_" I also know I can use the annotation...

@ SerializedName (" custom_naming ")

...but do not want to have to write this for alllllll my fields ...

It's very useful for me to distinguish between local variables and fields of a class. :( Any Idea?

EDIT: There would be many obvious solutions, (inheritance, gson overwriting methods, regular expresions). My question is more focused on whether there is a native solution of gson or a less intrusive fix?

Maybe we could propose as new FieldNamePolicy?

like image 648
enagra Avatar asked Feb 19 '13 19:02

enagra


People also ask

How do I ignore fields in Gson?

ExclusionStrategy strategy = new ExclusionStrategy() { @Override public boolean shouldSkipClass(Class<?> clazz) { return false; } @Override public boolean shouldSkipField(FieldAttributes field) { return field. getAnnotation(Exclude. class) !=

What is Gson serialization and Deserialization?

Gson can serialize a collection of arbitrary objects but can't deserialize the data without additional information. That's because there's no way for the user to indicate the type of the resulting object. Instead, while deserializing, the Collection must be of a specific, generic type.

How do you serialize with Gson?

Serialization in the context of Gson means converting a Java object to its JSON representation. In order to do the serialization, we need to create the Gson object, which handles the conversion. Next, we need to call the function toJson() and pass the User object. Program output.

Does Gson ignore extra fields?

3. Deserialize JSON With Extra Unknown Fields to Object. As you can see, Gson will ignore the unknown fields and simply match the fields that it's able to.


2 Answers

GsonBuilder provides a method setFieldNamingStrategy() that allows you to pass your own FieldNamingStrategy implementation.

Note that this replaces the call to setFieldNamingPolicy() - if you look at the source for GsonBuilder these two methods are mutually exclusive as they set the same internal field (The FieldNamingPolicy enum is a FieldNamingStrategy).

public class App
{
    public static void main(String[] args)
    {
        Gson gson = new GsonBuilder()
                        .setFieldNamingStrategy(new MyFieldNamingStrategy())
                        .setPrettyPrinting()
                        .create();

        System.out.println(gson.toJson(new ExampleBean()));
    }
}

class ExampleBean
{

    private String _firstField = "first field value";
    private String _secondField = "second field value";
    // respective getters and setters
}

class MyFieldNamingStrategy implements FieldNamingStrategy
{
    public String translateName(Field field)
    {
        String fieldName = 
            FieldNamingPolicy.UPPER_CAMEL_CASE.translateName(field);
        if (fieldName.startsWith("_"))
        {
            fieldName = fieldName.substring(1);
        }
        return fieldName;
    }
}

Output:

{
  "FirstField": "first field value",
  "SecondField": "second field value"
}
like image 125
Brian Roach Avatar answered Oct 06 '22 17:10

Brian Roach


What you want is

import java.lang.reflect.Field;
import java.text.DateFormat;

import com.google.gson.FieldNamingStrategy;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;

public class GsonExample {

    public static void main(String... args) throws Exception {
        final GsonBuilder builder = new GsonBuilder();
        builder.setDateFormat(DateFormat.LONG);
        builder.setPrettyPrinting();
        builder.setFieldNamingStrategy(new FieldNamingStrategy() {
            @Override
            public String translateName(Field f) {
                String fieldName = f.getName();
                if(fieldName.startsWith("_") && fieldName.length() > 1) {
                    fieldName = fieldName.substring(1, 2).toUpperCase() + fieldName.substring(2);
                }
                return fieldName;
            }
        });
        final Gson gson = builder.create();
        System.out.println(gson.toJson(new ExampleBean("example", "bean")));
    }


    private static class ExampleBean {
        private final String _firstField;
        private final String _secondField;

        private ExampleBean(String _firstField, String _secondField) {
            this._firstField = _firstField;
            this._secondField = _secondField;
        }
    }
}

which generates

{"FirstField":"example","SecondField":"bean"}
like image 29
Kirby Avatar answered Oct 06 '22 16:10

Kirby