Explicitly parse JSON string vs JSON.deserialize The 2019 Stack Overflow Developer Survey...

How are circuits which use complex ICs normally simulated?

Can a rogue use sneak attack with weapons that have the thrown property even if they are not thrown?

Should I use my personal e-mail address, or my workplace one, when registering to external websites for work purposes?

Protecting Dualbooting Windows from dangerous code (like rm -rf)

Did 3000BC Egyptians use meteoric iron weapons?

Time travel alters history but people keep saying nothing's changed

How to type this arrow in math mode?

Did Scotland spend $250,000 for the slogan "Welcome to Scotland"?

Which Sci-Fi work first showed weapon of galactic-scale mass destruction?

How can I autofill dates in Excel excluding Sunday?

Delete all lines which don't have n characters before delimiter

When should I buy a clipper card after flying to OAK?

Why didn't the Event Horizon Telescope team mention Sagittarius A*?

Can you compress metal and what would be the consequences?

Multiply Two Integer Polynomials

Can someone be penalized for an "unlawful" act if no penalty is specified?

What is the motivation for a law requiring 2 parties to consent for recording a conversation

Where to refill my bottle in India?

Is a "Democratic" Oligarchy-Style System Possible?

Are there any other methods to apply to solving simultaneous equations?

Does the shape of a die affect the probability of a number being rolled?

Are there incongruent pythagorean triangles with the same perimeter and same area?

Why did Acorn's A3000 have red function keys?

How to deal with fear of taking dependencies



Explicitly parse JSON string vs JSON.deserialize



The 2019 Stack Overflow Developer Survey Results Are InJSON and escaped double quoteParse nested JSONJSON parsing to Visualforce page difficultiesDefault values for Wrapper variables not setConvert date in JSON to Date from StringMethod does not exist or incorrect signature: void parse(String) from the type or_propertyJSONTestHow to parse JSON String through apexDeserializing/Parsing the JSON response to an Apex classJson2apex - Message consuming unrecognized propertyParse JSON using APEX provided JSON Methods





.everyoneloves__top-leaderboard:empty,.everyoneloves__mid-leaderboard:empty,.everyoneloves__bot-mid-leaderboard:empty{ margin-bottom:0;
}







1















The JSON2Apex web tool offers 2 methods of parsing of the JSON string: one uses JSON.deserialize method, and the other creates parser and iterates over the input json. The second option can be enabled by checking "Create explicit parse code" in the tool.



QUESTION



In what cases would a developer prefer explicit parsing to a simple JSON.deserialize? If we compare both options the later seems to be much clear and less verbose which makes code more readable.



Explicit parsing



public class JSON2Apex {

public class User {
public String name {get;set;}
public String twitter {get;set;}

public User(JSONParser parser) {
while (parser.nextToken() != System.JSONToken.END_OBJECT) {
if (parser.getCurrentToken() == System.JSONToken.FIELD_NAME) {
String text = parser.getText();
if (parser.nextToken() != System.JSONToken.VALUE_NULL) {
if (text == 'name') {
name = parser.getText();
} else if (text == 'twitter') {
twitter = parser.getText();
} else {
System.debug(LoggingLevel.WARN, 'User consuming unrecognized property: '+text);
consumeObject(parser);
}
}
}
}
}
}

public User user {get;set;}

public JSON2Apex(JSONParser parser) {
while (parser.nextToken() != System.JSONToken.END_OBJECT) {
if (parser.getCurrentToken() == System.JSONToken.FIELD_NAME) {
String text = parser.getText();
if (parser.nextToken() != System.JSONToken.VALUE_NULL) {
if (text == 'user') {
user = new User(parser);
} else {
System.debug(LoggingLevel.WARN, 'JSON2Apex consuming unrecognized property: '+text);
consumeObject(parser);
}
}
}
}
}


public static JSON2Apex parse(String json) {
System.JSONParser parser = System.JSON.createParser(json);
return new JSON2Apex(parser);
}

public static void consumeObject(System.JSONParser parser) {
Integer depth = 0;
do {
System.JSONToken curr = parser.getCurrentToken();
if (curr == System.JSONToken.START_OBJECT ||
curr == System.JSONToken.START_ARRAY) {
depth++;
} else if (curr == System.JSONToken.END_OBJECT ||
curr == System.JSONToken.END_ARRAY) {
depth--;
}
} while (depth > 0 && parser.nextToken() != null);
}




}


JSON.deserialize



public class JSON2Apex {

public class User {
public String name;
public String twitter;
}

public User user;


public static JSON2Apex parse(String json) {
return (JSON2Apex) System.JSON.deserialize(json, JSON2Apex.class);
}
}









share|improve this question





























    1















    The JSON2Apex web tool offers 2 methods of parsing of the JSON string: one uses JSON.deserialize method, and the other creates parser and iterates over the input json. The second option can be enabled by checking "Create explicit parse code" in the tool.



    QUESTION



    In what cases would a developer prefer explicit parsing to a simple JSON.deserialize? If we compare both options the later seems to be much clear and less verbose which makes code more readable.



    Explicit parsing



    public class JSON2Apex {

    public class User {
    public String name {get;set;}
    public String twitter {get;set;}

    public User(JSONParser parser) {
    while (parser.nextToken() != System.JSONToken.END_OBJECT) {
    if (parser.getCurrentToken() == System.JSONToken.FIELD_NAME) {
    String text = parser.getText();
    if (parser.nextToken() != System.JSONToken.VALUE_NULL) {
    if (text == 'name') {
    name = parser.getText();
    } else if (text == 'twitter') {
    twitter = parser.getText();
    } else {
    System.debug(LoggingLevel.WARN, 'User consuming unrecognized property: '+text);
    consumeObject(parser);
    }
    }
    }
    }
    }
    }

    public User user {get;set;}

    public JSON2Apex(JSONParser parser) {
    while (parser.nextToken() != System.JSONToken.END_OBJECT) {
    if (parser.getCurrentToken() == System.JSONToken.FIELD_NAME) {
    String text = parser.getText();
    if (parser.nextToken() != System.JSONToken.VALUE_NULL) {
    if (text == 'user') {
    user = new User(parser);
    } else {
    System.debug(LoggingLevel.WARN, 'JSON2Apex consuming unrecognized property: '+text);
    consumeObject(parser);
    }
    }
    }
    }
    }


    public static JSON2Apex parse(String json) {
    System.JSONParser parser = System.JSON.createParser(json);
    return new JSON2Apex(parser);
    }

    public static void consumeObject(System.JSONParser parser) {
    Integer depth = 0;
    do {
    System.JSONToken curr = parser.getCurrentToken();
    if (curr == System.JSONToken.START_OBJECT ||
    curr == System.JSONToken.START_ARRAY) {
    depth++;
    } else if (curr == System.JSONToken.END_OBJECT ||
    curr == System.JSONToken.END_ARRAY) {
    depth--;
    }
    } while (depth > 0 && parser.nextToken() != null);
    }




    }


    JSON.deserialize



    public class JSON2Apex {

    public class User {
    public String name;
    public String twitter;
    }

    public User user;


    public static JSON2Apex parse(String json) {
    return (JSON2Apex) System.JSON.deserialize(json, JSON2Apex.class);
    }
    }









    share|improve this question

























      1












      1








      1








      The JSON2Apex web tool offers 2 methods of parsing of the JSON string: one uses JSON.deserialize method, and the other creates parser and iterates over the input json. The second option can be enabled by checking "Create explicit parse code" in the tool.



      QUESTION



      In what cases would a developer prefer explicit parsing to a simple JSON.deserialize? If we compare both options the later seems to be much clear and less verbose which makes code more readable.



      Explicit parsing



      public class JSON2Apex {

      public class User {
      public String name {get;set;}
      public String twitter {get;set;}

      public User(JSONParser parser) {
      while (parser.nextToken() != System.JSONToken.END_OBJECT) {
      if (parser.getCurrentToken() == System.JSONToken.FIELD_NAME) {
      String text = parser.getText();
      if (parser.nextToken() != System.JSONToken.VALUE_NULL) {
      if (text == 'name') {
      name = parser.getText();
      } else if (text == 'twitter') {
      twitter = parser.getText();
      } else {
      System.debug(LoggingLevel.WARN, 'User consuming unrecognized property: '+text);
      consumeObject(parser);
      }
      }
      }
      }
      }
      }

      public User user {get;set;}

      public JSON2Apex(JSONParser parser) {
      while (parser.nextToken() != System.JSONToken.END_OBJECT) {
      if (parser.getCurrentToken() == System.JSONToken.FIELD_NAME) {
      String text = parser.getText();
      if (parser.nextToken() != System.JSONToken.VALUE_NULL) {
      if (text == 'user') {
      user = new User(parser);
      } else {
      System.debug(LoggingLevel.WARN, 'JSON2Apex consuming unrecognized property: '+text);
      consumeObject(parser);
      }
      }
      }
      }
      }


      public static JSON2Apex parse(String json) {
      System.JSONParser parser = System.JSON.createParser(json);
      return new JSON2Apex(parser);
      }

      public static void consumeObject(System.JSONParser parser) {
      Integer depth = 0;
      do {
      System.JSONToken curr = parser.getCurrentToken();
      if (curr == System.JSONToken.START_OBJECT ||
      curr == System.JSONToken.START_ARRAY) {
      depth++;
      } else if (curr == System.JSONToken.END_OBJECT ||
      curr == System.JSONToken.END_ARRAY) {
      depth--;
      }
      } while (depth > 0 && parser.nextToken() != null);
      }




      }


      JSON.deserialize



      public class JSON2Apex {

      public class User {
      public String name;
      public String twitter;
      }

      public User user;


      public static JSON2Apex parse(String json) {
      return (JSON2Apex) System.JSON.deserialize(json, JSON2Apex.class);
      }
      }









      share|improve this question














      The JSON2Apex web tool offers 2 methods of parsing of the JSON string: one uses JSON.deserialize method, and the other creates parser and iterates over the input json. The second option can be enabled by checking "Create explicit parse code" in the tool.



      QUESTION



      In what cases would a developer prefer explicit parsing to a simple JSON.deserialize? If we compare both options the later seems to be much clear and less verbose which makes code more readable.



      Explicit parsing



      public class JSON2Apex {

      public class User {
      public String name {get;set;}
      public String twitter {get;set;}

      public User(JSONParser parser) {
      while (parser.nextToken() != System.JSONToken.END_OBJECT) {
      if (parser.getCurrentToken() == System.JSONToken.FIELD_NAME) {
      String text = parser.getText();
      if (parser.nextToken() != System.JSONToken.VALUE_NULL) {
      if (text == 'name') {
      name = parser.getText();
      } else if (text == 'twitter') {
      twitter = parser.getText();
      } else {
      System.debug(LoggingLevel.WARN, 'User consuming unrecognized property: '+text);
      consumeObject(parser);
      }
      }
      }
      }
      }
      }

      public User user {get;set;}

      public JSON2Apex(JSONParser parser) {
      while (parser.nextToken() != System.JSONToken.END_OBJECT) {
      if (parser.getCurrentToken() == System.JSONToken.FIELD_NAME) {
      String text = parser.getText();
      if (parser.nextToken() != System.JSONToken.VALUE_NULL) {
      if (text == 'user') {
      user = new User(parser);
      } else {
      System.debug(LoggingLevel.WARN, 'JSON2Apex consuming unrecognized property: '+text);
      consumeObject(parser);
      }
      }
      }
      }
      }


      public static JSON2Apex parse(String json) {
      System.JSONParser parser = System.JSON.createParser(json);
      return new JSON2Apex(parser);
      }

      public static void consumeObject(System.JSONParser parser) {
      Integer depth = 0;
      do {
      System.JSONToken curr = parser.getCurrentToken();
      if (curr == System.JSONToken.START_OBJECT ||
      curr == System.JSONToken.START_ARRAY) {
      depth++;
      } else if (curr == System.JSONToken.END_OBJECT ||
      curr == System.JSONToken.END_ARRAY) {
      depth--;
      }
      } while (depth > 0 && parser.nextToken() != null);
      }




      }


      JSON.deserialize



      public class JSON2Apex {

      public class User {
      public String name;
      public String twitter;
      }

      public User user;


      public static JSON2Apex parse(String json) {
      return (JSON2Apex) System.JSON.deserialize(json, JSON2Apex.class);
      }
      }






      json parsing






      share|improve this question













      share|improve this question











      share|improve this question




      share|improve this question










      asked yesterday









      EduardEduard

      1,8872723




      1,8872723






















          1 Answer
          1






          active

          oldest

          votes


















          4














          Apex code has reserved names (keywords) and special variable rules (e.g. cannot start with a number, can't have __, etc) that you can't use in JSON objects. You don't want to use explicit mode if you can help it, because it has worse performance compared to JSON.deserialize, but it gets around compilation errors if you have a JSON string like:



          { "title": "Writing JSON", "abstract": "A short document about how to use JSON." }


          This would compile to:



          public class JSON2Apex {
          public String title;
          public String abstract;
          }


          But abstract is a reserved keyword. You can't deploy this code to Salesforce. By changing the code:



          public class JSON2Apex {
          public String title;
          public String abstract_x;
          }


          The code can then compile, but you need explicit parsing in order to translate abstract in the JSON string to abstract_x in Apex.






          share|improve this answer
























          • Thanks for your prompt answer! If this is the only reason why a developer would use explicit parsing, then I would definitely go with deserialize all the time. It's possible to keep a Map of reserved words and their substitutes, and perform replace in the input json string before parsing. This is exaclty how the ffhttp_JsonDeserializer.cls class works.

            – Eduard
            yesterday






          • 1





            @Eduard Yes, there are better ways. JSON2Apex is a rather old utility, useful in most cases, but explicit mode wasn't the best idea. There's definitely better ways to do it.

            – sfdcfox
            yesterday












          Your Answer








          StackExchange.ready(function() {
          var channelOptions = {
          tags: "".split(" "),
          id: "459"
          };
          initTagRenderer("".split(" "), "".split(" "), channelOptions);

          StackExchange.using("externalEditor", function() {
          // Have to fire editor after snippets, if snippets enabled
          if (StackExchange.settings.snippets.snippetsEnabled) {
          StackExchange.using("snippets", function() {
          createEditor();
          });
          }
          else {
          createEditor();
          }
          });

          function createEditor() {
          StackExchange.prepareEditor({
          heartbeatType: 'answer',
          autoActivateHeartbeat: false,
          convertImagesToLinks: false,
          noModals: true,
          showLowRepImageUploadWarning: true,
          reputationToPostImages: null,
          bindNavPrevention: true,
          postfix: "",
          imageUploader: {
          brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
          contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
          allowUrls: true
          },
          onDemand: true,
          discardSelector: ".discard-answer"
          ,immediatelyShowMarkdownHelp:true
          });


          }
          });














          draft saved

          draft discarded


















          StackExchange.ready(
          function () {
          StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fsalesforce.stackexchange.com%2fquestions%2f257118%2fexplicitly-parse-json-string-vs-json-deserialize%23new-answer', 'question_page');
          }
          );

          Post as a guest















          Required, but never shown

























          1 Answer
          1






          active

          oldest

          votes








          1 Answer
          1






          active

          oldest

          votes









          active

          oldest

          votes






          active

          oldest

          votes









          4














          Apex code has reserved names (keywords) and special variable rules (e.g. cannot start with a number, can't have __, etc) that you can't use in JSON objects. You don't want to use explicit mode if you can help it, because it has worse performance compared to JSON.deserialize, but it gets around compilation errors if you have a JSON string like:



          { "title": "Writing JSON", "abstract": "A short document about how to use JSON." }


          This would compile to:



          public class JSON2Apex {
          public String title;
          public String abstract;
          }


          But abstract is a reserved keyword. You can't deploy this code to Salesforce. By changing the code:



          public class JSON2Apex {
          public String title;
          public String abstract_x;
          }


          The code can then compile, but you need explicit parsing in order to translate abstract in the JSON string to abstract_x in Apex.






          share|improve this answer
























          • Thanks for your prompt answer! If this is the only reason why a developer would use explicit parsing, then I would definitely go with deserialize all the time. It's possible to keep a Map of reserved words and their substitutes, and perform replace in the input json string before parsing. This is exaclty how the ffhttp_JsonDeserializer.cls class works.

            – Eduard
            yesterday






          • 1





            @Eduard Yes, there are better ways. JSON2Apex is a rather old utility, useful in most cases, but explicit mode wasn't the best idea. There's definitely better ways to do it.

            – sfdcfox
            yesterday
















          4














          Apex code has reserved names (keywords) and special variable rules (e.g. cannot start with a number, can't have __, etc) that you can't use in JSON objects. You don't want to use explicit mode if you can help it, because it has worse performance compared to JSON.deserialize, but it gets around compilation errors if you have a JSON string like:



          { "title": "Writing JSON", "abstract": "A short document about how to use JSON." }


          This would compile to:



          public class JSON2Apex {
          public String title;
          public String abstract;
          }


          But abstract is a reserved keyword. You can't deploy this code to Salesforce. By changing the code:



          public class JSON2Apex {
          public String title;
          public String abstract_x;
          }


          The code can then compile, but you need explicit parsing in order to translate abstract in the JSON string to abstract_x in Apex.






          share|improve this answer
























          • Thanks for your prompt answer! If this is the only reason why a developer would use explicit parsing, then I would definitely go with deserialize all the time. It's possible to keep a Map of reserved words and their substitutes, and perform replace in the input json string before parsing. This is exaclty how the ffhttp_JsonDeserializer.cls class works.

            – Eduard
            yesterday






          • 1





            @Eduard Yes, there are better ways. JSON2Apex is a rather old utility, useful in most cases, but explicit mode wasn't the best idea. There's definitely better ways to do it.

            – sfdcfox
            yesterday














          4












          4








          4







          Apex code has reserved names (keywords) and special variable rules (e.g. cannot start with a number, can't have __, etc) that you can't use in JSON objects. You don't want to use explicit mode if you can help it, because it has worse performance compared to JSON.deserialize, but it gets around compilation errors if you have a JSON string like:



          { "title": "Writing JSON", "abstract": "A short document about how to use JSON." }


          This would compile to:



          public class JSON2Apex {
          public String title;
          public String abstract;
          }


          But abstract is a reserved keyword. You can't deploy this code to Salesforce. By changing the code:



          public class JSON2Apex {
          public String title;
          public String abstract_x;
          }


          The code can then compile, but you need explicit parsing in order to translate abstract in the JSON string to abstract_x in Apex.






          share|improve this answer













          Apex code has reserved names (keywords) and special variable rules (e.g. cannot start with a number, can't have __, etc) that you can't use in JSON objects. You don't want to use explicit mode if you can help it, because it has worse performance compared to JSON.deserialize, but it gets around compilation errors if you have a JSON string like:



          { "title": "Writing JSON", "abstract": "A short document about how to use JSON." }


          This would compile to:



          public class JSON2Apex {
          public String title;
          public String abstract;
          }


          But abstract is a reserved keyword. You can't deploy this code to Salesforce. By changing the code:



          public class JSON2Apex {
          public String title;
          public String abstract_x;
          }


          The code can then compile, but you need explicit parsing in order to translate abstract in the JSON string to abstract_x in Apex.







          share|improve this answer












          share|improve this answer



          share|improve this answer










          answered yesterday









          sfdcfoxsfdcfox

          264k13210457




          264k13210457













          • Thanks for your prompt answer! If this is the only reason why a developer would use explicit parsing, then I would definitely go with deserialize all the time. It's possible to keep a Map of reserved words and their substitutes, and perform replace in the input json string before parsing. This is exaclty how the ffhttp_JsonDeserializer.cls class works.

            – Eduard
            yesterday






          • 1





            @Eduard Yes, there are better ways. JSON2Apex is a rather old utility, useful in most cases, but explicit mode wasn't the best idea. There's definitely better ways to do it.

            – sfdcfox
            yesterday



















          • Thanks for your prompt answer! If this is the only reason why a developer would use explicit parsing, then I would definitely go with deserialize all the time. It's possible to keep a Map of reserved words and their substitutes, and perform replace in the input json string before parsing. This is exaclty how the ffhttp_JsonDeserializer.cls class works.

            – Eduard
            yesterday






          • 1





            @Eduard Yes, there are better ways. JSON2Apex is a rather old utility, useful in most cases, but explicit mode wasn't the best idea. There's definitely better ways to do it.

            – sfdcfox
            yesterday

















          Thanks for your prompt answer! If this is the only reason why a developer would use explicit parsing, then I would definitely go with deserialize all the time. It's possible to keep a Map of reserved words and their substitutes, and perform replace in the input json string before parsing. This is exaclty how the ffhttp_JsonDeserializer.cls class works.

          – Eduard
          yesterday





          Thanks for your prompt answer! If this is the only reason why a developer would use explicit parsing, then I would definitely go with deserialize all the time. It's possible to keep a Map of reserved words and their substitutes, and perform replace in the input json string before parsing. This is exaclty how the ffhttp_JsonDeserializer.cls class works.

          – Eduard
          yesterday




          1




          1





          @Eduard Yes, there are better ways. JSON2Apex is a rather old utility, useful in most cases, but explicit mode wasn't the best idea. There's definitely better ways to do it.

          – sfdcfox
          yesterday





          @Eduard Yes, there are better ways. JSON2Apex is a rather old utility, useful in most cases, but explicit mode wasn't the best idea. There's definitely better ways to do it.

          – sfdcfox
          yesterday


















          draft saved

          draft discarded




















































          Thanks for contributing an answer to Salesforce Stack Exchange!


          • Please be sure to answer the question. Provide details and share your research!

          But avoid



          • Asking for help, clarification, or responding to other answers.

          • Making statements based on opinion; back them up with references or personal experience.


          To learn more, see our tips on writing great answers.




          draft saved


          draft discarded














          StackExchange.ready(
          function () {
          StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fsalesforce.stackexchange.com%2fquestions%2f257118%2fexplicitly-parse-json-string-vs-json-deserialize%23new-answer', 'question_page');
          }
          );

          Post as a guest















          Required, but never shown





















































          Required, but never shown














          Required, but never shown












          Required, but never shown







          Required, but never shown

































          Required, but never shown














          Required, but never shown












          Required, but never shown







          Required, but never shown







          Popular posts from this blog

          VNC viewer RFB protocol error: bad desktop size 0x0I Cannot Type the Key 'd' (lowercase) in VNC Viewer...

          Couldn't open a raw socket. Error: Permission denied (13) (nmap)Is it possible to run networking commands...

          Why not use the yoke to control yaw, as well as pitch and roll? Announcing the arrival of...