Sign Up

Sign Up to our social questions and Answers Engine to ask questions, answer people’s questions, and connect with other people.

Have an account? Sign In

Have an account? Sign In Now

Sign In

Login to our social questions & Answers Engine to ask questions answer people’s questions & connect with other people.

Sign Up Here

Forgot Password?

Don't have account, Sign Up Here

Forgot Password

Lost your password? Please enter your email address. You will receive a link and will create a new password via email.

Have an account? Sign In Now

You must login to ask a question.

Forgot Password?

Need An Account, Sign Up Here

Please briefly explain why you feel this question should be reported.

Please briefly explain why you feel this answer should be reported.

Please briefly explain why you feel this user should be reported.

Sign InSign Up

The Archive Base

The Archive Base Logo The Archive Base Logo

The Archive Base Navigation

  • SEARCH
  • Home
  • About Us
  • Blog
  • Contact Us
Search
Ask A Question

Mobile menu

Close
Ask a Question
  • Home
  • Add group
  • Groups page
  • Feed
  • User Profile
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Buy Points
  • Users
  • Help
  • Buy Theme
  • SEARCH
Home/ Questions/Q 9132643
In Process

The Archive Base Latest Questions

Editorial Team
  • 0
Editorial Team
Asked: June 17, 20262026-06-17T08:20:46+00:00 2026-06-17T08:20:46+00:00

I use Gson inside my projects to deserialize JSON-Strings to Java-Objects. If I do

  • 0

I use Gson inside my projects to deserialize JSON-Strings to Java-Objects. If I do a request, I expect a well-defined response from the Server. The Server will either return the well-defined response I expect, OR it will return me an (also defined) error Object.

To make things clear: suppose I have a simple Object like this:

class Dummy{
   private String foo;
   private int bar;
}

and an Error Object like this:

class ErrorHolder{
   private RequestError error;
}

class RequestError{
    private String publicMsg;
    private String msg;
}

If I get a Server-response like

{"foo":"Hello World", "bar":3 }

everything works as expected.

But if the response is like this

{"error":{"publicMsg":"Something bad happened", msg:"you forgot requesting some parameter"}}

I’ll get kind of an Dummy object where foo is null and bar is 0! The Gson documentation (fromJson) clearly states that:

throws
JsonSyntaxException – if json is not a valid representation for an
object of type classOfT

so i expected to get an JsonSyntaxException if I try to parse the second response like this:

Dummy dummy = Gson.fromJson(secondResponse, Dummy.class);

because the Json doesn’t represent a Dummy object, but an ErrorHolder Object.

So my question is: Is there a way, that Gson detects a wrong type somehow, and throws me an Exception?

  • 1 1 Answer
  • 0 Views
  • 0 Followers
  • 0
Share
  • Facebook
  • Report

Leave an answer
Cancel reply

You must login to add an answer.

Forgot Password?

Need An Account, Sign Up Here

1 Answer

  • Voted
  • Oldest
  • Recent
  • Random
  1. Editorial Team
    Editorial Team
    2026-06-17T08:20:48+00:00Added an answer on June 17, 2026 at 8:20 am

    Unfortunately the documentation is slightly misleading there.

    It will only throw the exception if your class had a field whose type didn’t match what is in the JSON, and even then it does some crazy things to try and fix it (converting an int in the JSON to a String in your class for example). If you had something like a Date field in your POJO and it encountered an int in the JSON, it’d throw it. Fields that are present in the JSON but not in your POJO are silently ignored, fields that are missing in the JSON but exist in your POJO are set to null.

    At present, GSON does not provide a mechanism for any sort of “strict” deserialization where you would have something like a @Required annotation for fields in your POJO.

    In your case … I’d simply expand my POJO to include an inner error object … something like:

    class Dummy {
       private String foo;
       private int bar;
       private Error error;
    
       private class Error {
            String publicMsg;
            String msg;
       }
    
       public boolean isError() {
           return error != null;
       }
    
       // setters and getters for your data, the error msg, etc.
    }
    

    Your other option is to write a custom deserializer that throws the exception if the JSON is the error such as:

    class MyDeserializer implements JsonDeserializer<Dummy>
    {
        @Override
        public Dummy deserialize(JsonElement json, Type typeOfT, 
                                  JsonDeserializationContext context)
                        throws JsonParseException
        {
            JsonObject jsonObject = (JsonObject) json;
    
            if (jsonObject.get("error") != null)
            {
                throw new JsonParseException("Error!");
            }
    
            return new Gson().fromJson(json, Dummy.class);
        }
    } 
    

    Edit to Add: Someone upvoted this recently and re-reading it I thought “Huh, you know, you could do this yourself and it might be handy”.

    Here’s a re-usable deserializer and annotation that will do exactly what the OP wanted. The limitation is that if the POJO required a custom deserializer as-is, you’d have to go a little further and either pass in a Gson object in the constructor to deserialize to object itself or move the annotation checking out into a separate method and use it in your deserializer. You could also improve on the exception handling by creating your own exception and pass it to the JsonParseException so it can be detected via getCause() in the caller.

    That all said, in the vast majority of cases, this will work:

    public class App
    {
    
        public static void main(String[] args)
        {
            Gson gson =
                new GsonBuilder()
                .registerTypeAdapter(TestAnnotationBean.class, new AnnotatedDeserializer<TestAnnotationBean>())
                .create();
    
            String json = "{\"foo\":\"This is foo\",\"bar\":\"this is bar\"}";
            TestAnnotationBean tab = gson.fromJson(json, TestAnnotationBean.class);
            System.out.println(tab.foo);
            System.out.println(tab.bar);
    
            json = "{\"foo\":\"This is foo\"}";
            tab = gson.fromJson(json, TestAnnotationBean.class);
            System.out.println(tab.foo);
            System.out.println(tab.bar);
    
            json = "{\"bar\":\"This is bar\"}";
            tab = gson.fromJson(json, TestAnnotationBean.class);
            System.out.println(tab.foo);
            System.out.println(tab.bar);
        }
    }
    
    @Retention(RetentionPolicy.RUNTIME)
    @Target(ElementType.FIELD)
    @interface JsonRequired
    {
    }
    
    class TestAnnotationBean
    {
        @JsonRequired public String foo;
        public String bar;
    }
    
    class AnnotatedDeserializer<T> implements JsonDeserializer<T>
    {
    
        public T deserialize(JsonElement je, Type type, JsonDeserializationContext jdc) throws JsonParseException
        {
            T pojo = new Gson().fromJson(je, type);
    
            Field[] fields = pojo.getClass().getDeclaredFields();
            for (Field f : fields)
            {
                if (f.getAnnotation(JsonRequired.class) != null)
                {
                    try
                    {
                        f.setAccessible(true);
                        if (f.get(pojo) == null)
                        {
                            throw new JsonParseException("Missing field in JSON: " + f.getName());
                        }
                    }
                    catch (IllegalArgumentException ex)
                    {
                        Logger.getLogger(AnnotatedDeserializer.class.getName()).log(Level.SEVERE, null, ex);
                    }
                    catch (IllegalAccessException ex)
                    {
                        Logger.getLogger(AnnotatedDeserializer.class.getName()).log(Level.SEVERE, null, ex);
                    }
                }
            }
            return pojo;
    
        }
    }
    

    Output:

    This is foo
    this is bar
    This is foo
    null
    Exception in thread "main" com.google.gson.JsonParseException: Missing field in JSON: foo
    
    • 0
    • Reply
    • Share
      Share
      • Share on Facebook
      • Share on Twitter
      • Share on LinkedIn
      • Share on WhatsApp
      • Report

Sidebar

Related Questions

I like to use GSON to deserialize the following JSON String. { type: FeatureCollection,
I try to use gson library to deserialize a flow of objects sent to
I want to deserialize a JSON object (using GSON, because I already use it
I use google-gson to serialize a Java map into a JSON string. It provides
I'm trying to parse Json to Java by using Gson, but when I use
I am trying to use Gson to deserialize a json array, but am currently
I want to use Gson to parse my JSON, I've added Gson library into
I have a method for reading JSON from a service, I'm using Gson to
I am trying to use GSON to convert a Json string to an object.
I'm trying to figure out how to use gson to convert reddit's api response

Explore

  • Home
  • Add group
  • Groups page
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Users
  • Help
  • SEARCH

Footer

© 2021 The Archive Base. All Rights Reserved
With Love by The Archive Base

Insert/edit link

Enter the destination URL

Or link to existing content

    No search term specified. Showing recent items. Search or use up and down arrow keys to select an item.