JSON.serialize: is it possible to suppress null values of a map?





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







3















I tried to serialize a map with null value (api 45):



Map<String, String> bodyMap = new Map<String, String> {'key'=>'value', 'key2'=>null};
System.debug(JSON.serialize(bodyMap,true));


but it does not suppress null value (as it does in a custom object):



{"key2":null,"key":"value"}


Does it work as expected? Is there any other way than writing custom serialiser?










share|improve this question























  • I don't believe that there is a way other than a custom serializer that you can use. Out the box JSON methods will take what they have an serialize it as is . With a custom serializer you will have the option of supplying a replacement for a null value.

    – Ronnie
    yesterday











  • This method serialize(objectToSerialize, suppressApexObjectNulls) seems to work specifically on Apex Object types only and that the platform considers a Collection to be distinct from an Apex Object.

    – Jayant Das
    yesterday











  • @JayantDas True. Same behaviour with List.

    – kvor
    yesterday











  • @kvor Even though it does not clearly calls out, but going through few references it does establish this distinction, I have added details as answer, if that helps.

    – Jayant Das
    yesterday


















3















I tried to serialize a map with null value (api 45):



Map<String, String> bodyMap = new Map<String, String> {'key'=>'value', 'key2'=>null};
System.debug(JSON.serialize(bodyMap,true));


but it does not suppress null value (as it does in a custom object):



{"key2":null,"key":"value"}


Does it work as expected? Is there any other way than writing custom serialiser?










share|improve this question























  • I don't believe that there is a way other than a custom serializer that you can use. Out the box JSON methods will take what they have an serialize it as is . With a custom serializer you will have the option of supplying a replacement for a null value.

    – Ronnie
    yesterday











  • This method serialize(objectToSerialize, suppressApexObjectNulls) seems to work specifically on Apex Object types only and that the platform considers a Collection to be distinct from an Apex Object.

    – Jayant Das
    yesterday











  • @JayantDas True. Same behaviour with List.

    – kvor
    yesterday











  • @kvor Even though it does not clearly calls out, but going through few references it does establish this distinction, I have added details as answer, if that helps.

    – Jayant Das
    yesterday














3












3








3


1






I tried to serialize a map with null value (api 45):



Map<String, String> bodyMap = new Map<String, String> {'key'=>'value', 'key2'=>null};
System.debug(JSON.serialize(bodyMap,true));


but it does not suppress null value (as it does in a custom object):



{"key2":null,"key":"value"}


Does it work as expected? Is there any other way than writing custom serialiser?










share|improve this question














I tried to serialize a map with null value (api 45):



Map<String, String> bodyMap = new Map<String, String> {'key'=>'value', 'key2'=>null};
System.debug(JSON.serialize(bodyMap,true));


but it does not suppress null value (as it does in a custom object):



{"key2":null,"key":"value"}


Does it work as expected? Is there any other way than writing custom serialiser?







apex json null serialize






share|improve this question













share|improve this question











share|improve this question




share|improve this question










asked yesterday









kvorkvor

785




785













  • I don't believe that there is a way other than a custom serializer that you can use. Out the box JSON methods will take what they have an serialize it as is . With a custom serializer you will have the option of supplying a replacement for a null value.

    – Ronnie
    yesterday











  • This method serialize(objectToSerialize, suppressApexObjectNulls) seems to work specifically on Apex Object types only and that the platform considers a Collection to be distinct from an Apex Object.

    – Jayant Das
    yesterday











  • @JayantDas True. Same behaviour with List.

    – kvor
    yesterday











  • @kvor Even though it does not clearly calls out, but going through few references it does establish this distinction, I have added details as answer, if that helps.

    – Jayant Das
    yesterday



















  • I don't believe that there is a way other than a custom serializer that you can use. Out the box JSON methods will take what they have an serialize it as is . With a custom serializer you will have the option of supplying a replacement for a null value.

    – Ronnie
    yesterday











  • This method serialize(objectToSerialize, suppressApexObjectNulls) seems to work specifically on Apex Object types only and that the platform considers a Collection to be distinct from an Apex Object.

    – Jayant Das
    yesterday











  • @JayantDas True. Same behaviour with List.

    – kvor
    yesterday











  • @kvor Even though it does not clearly calls out, but going through few references it does establish this distinction, I have added details as answer, if that helps.

    – Jayant Das
    yesterday

















I don't believe that there is a way other than a custom serializer that you can use. Out the box JSON methods will take what they have an serialize it as is . With a custom serializer you will have the option of supplying a replacement for a null value.

– Ronnie
yesterday





I don't believe that there is a way other than a custom serializer that you can use. Out the box JSON methods will take what they have an serialize it as is . With a custom serializer you will have the option of supplying a replacement for a null value.

– Ronnie
yesterday













This method serialize(objectToSerialize, suppressApexObjectNulls) seems to work specifically on Apex Object types only and that the platform considers a Collection to be distinct from an Apex Object.

– Jayant Das
yesterday





This method serialize(objectToSerialize, suppressApexObjectNulls) seems to work specifically on Apex Object types only and that the platform considers a Collection to be distinct from an Apex Object.

– Jayant Das
yesterday













@JayantDas True. Same behaviour with List.

– kvor
yesterday





@JayantDas True. Same behaviour with List.

– kvor
yesterday













@kvor Even though it does not clearly calls out, but going through few references it does establish this distinction, I have added details as answer, if that helps.

– Jayant Das
yesterday





@kvor Even though it does not clearly calls out, but going through few references it does establish this distinction, I have added details as answer, if that helps.

– Jayant Das
yesterday










3 Answers
3






active

oldest

votes


















2














The documentation for JSON.serialize(objectToSerialize, suppressApexObjectNulls)
mentions the type of objectToSerialize parameter as:




Type: Object



The Apex object to serialize.




And if you refer to other documentations (mentioned below), a Collection is always categorized differently than an Apex Object. Apex Object always refers to instances of custom/system classes within the platform.



So the behavior what you are experiencing is expected. Your option is to either go with a custom class or serialize only after removing the null values from the collection.





References for data types in Apex which mentions Collection differently than Apex Objects:




  • Data Types

  • Expressions






share|improve this answer































    7














    Yep, that's the expected behavior.



    For simple maps, you can get rid of null values by iterating over the map keys, keeping track of which ones have null values, and then a little map manipulation.



    Set<String> mapKeysToRemoveSet = new Set<String>();

    for(String key :myMap.keySet()){
    if(myMap.get(key) == null){
    mapKeysToRemoveSet.add(key);
    }
    }

    // The Map class only comes with a remove() method, which only removes one item from the
    // map at a time.
    // It's not a great idea to modify a collection while you're iterating over it.
    // The solution is to get the map's keyset, then use the set class's removeAll() method.
    // This has the effect of removing multiple items from the map in one shot.
    myMap.keySet().removeAll(mapKeysToRemoveSet);

    System.debug(JSON.serialize(myMap));





    share|improve this answer































      1














      This is a problem which I had faced, and I came across a string manipulation method that strips out nulls from null json keys.



        public static string stripJsonNulls(string JsonString)
      {

      if(JsonString != null)
      {
      JsonString = JsonString.replaceAll('"[^"]*":null',''); //basic removeal of null values
      JsonString = JsonString.replaceAll(',{2,}', ','); //remove duplicate/multiple commas
      JsonString = JsonString.replace('{,', '{'); //prevent opening brace from having a comma after it
      JsonString = JsonString.replace(',}', '}'); //prevent closing brace from having a comma before it
      JsonString = JsonString.replace('[,', '['); //prevent opening bracket from having a comma after it
      JsonString = JsonString.replace(',]', ']'); //prevent closing bracket from having a comma before it
      }

      return JsonString;
      }


      Map<String, String> bodyMap = new Map<String, String> {'key'=>'value', 'key2'=>null};
      System.debug(stripJsonNulls(JSON.serialize(bodyMap,false)));


      OP : {"key":"value"}



      Src: https://iwritecrappycode.wordpress.com/2014/07/16/stripping-nulls-from-a-json-object-in-apex/






      share|improve this answer
























      • You want to trust a site called "I Write Crappy Code?"

        – corsiKa
        yesterday











      • 😛 what's in the name ~ Shakespeare

        – Pranay Jaiswal
        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%2f257158%2fjson-serialize-is-it-possible-to-suppress-null-values-of-a-map%23new-answer', 'question_page');
      }
      );

      Post as a guest















      Required, but never shown

























      3 Answers
      3






      active

      oldest

      votes








      3 Answers
      3






      active

      oldest

      votes









      active

      oldest

      votes






      active

      oldest

      votes









      2














      The documentation for JSON.serialize(objectToSerialize, suppressApexObjectNulls)
      mentions the type of objectToSerialize parameter as:




      Type: Object



      The Apex object to serialize.




      And if you refer to other documentations (mentioned below), a Collection is always categorized differently than an Apex Object. Apex Object always refers to instances of custom/system classes within the platform.



      So the behavior what you are experiencing is expected. Your option is to either go with a custom class or serialize only after removing the null values from the collection.





      References for data types in Apex which mentions Collection differently than Apex Objects:




      • Data Types

      • Expressions






      share|improve this answer




























        2














        The documentation for JSON.serialize(objectToSerialize, suppressApexObjectNulls)
        mentions the type of objectToSerialize parameter as:




        Type: Object



        The Apex object to serialize.




        And if you refer to other documentations (mentioned below), a Collection is always categorized differently than an Apex Object. Apex Object always refers to instances of custom/system classes within the platform.



        So the behavior what you are experiencing is expected. Your option is to either go with a custom class or serialize only after removing the null values from the collection.





        References for data types in Apex which mentions Collection differently than Apex Objects:




        • Data Types

        • Expressions






        share|improve this answer


























          2












          2








          2







          The documentation for JSON.serialize(objectToSerialize, suppressApexObjectNulls)
          mentions the type of objectToSerialize parameter as:




          Type: Object



          The Apex object to serialize.




          And if you refer to other documentations (mentioned below), a Collection is always categorized differently than an Apex Object. Apex Object always refers to instances of custom/system classes within the platform.



          So the behavior what you are experiencing is expected. Your option is to either go with a custom class or serialize only after removing the null values from the collection.





          References for data types in Apex which mentions Collection differently than Apex Objects:




          • Data Types

          • Expressions






          share|improve this answer













          The documentation for JSON.serialize(objectToSerialize, suppressApexObjectNulls)
          mentions the type of objectToSerialize parameter as:




          Type: Object



          The Apex object to serialize.




          And if you refer to other documentations (mentioned below), a Collection is always categorized differently than an Apex Object. Apex Object always refers to instances of custom/system classes within the platform.



          So the behavior what you are experiencing is expected. Your option is to either go with a custom class or serialize only after removing the null values from the collection.





          References for data types in Apex which mentions Collection differently than Apex Objects:




          • Data Types

          • Expressions







          share|improve this answer












          share|improve this answer



          share|improve this answer










          answered yesterday









          Jayant DasJayant Das

          18.1k21330




          18.1k21330

























              7














              Yep, that's the expected behavior.



              For simple maps, you can get rid of null values by iterating over the map keys, keeping track of which ones have null values, and then a little map manipulation.



              Set<String> mapKeysToRemoveSet = new Set<String>();

              for(String key :myMap.keySet()){
              if(myMap.get(key) == null){
              mapKeysToRemoveSet.add(key);
              }
              }

              // The Map class only comes with a remove() method, which only removes one item from the
              // map at a time.
              // It's not a great idea to modify a collection while you're iterating over it.
              // The solution is to get the map's keyset, then use the set class's removeAll() method.
              // This has the effect of removing multiple items from the map in one shot.
              myMap.keySet().removeAll(mapKeysToRemoveSet);

              System.debug(JSON.serialize(myMap));





              share|improve this answer




























                7














                Yep, that's the expected behavior.



                For simple maps, you can get rid of null values by iterating over the map keys, keeping track of which ones have null values, and then a little map manipulation.



                Set<String> mapKeysToRemoveSet = new Set<String>();

                for(String key :myMap.keySet()){
                if(myMap.get(key) == null){
                mapKeysToRemoveSet.add(key);
                }
                }

                // The Map class only comes with a remove() method, which only removes one item from the
                // map at a time.
                // It's not a great idea to modify a collection while you're iterating over it.
                // The solution is to get the map's keyset, then use the set class's removeAll() method.
                // This has the effect of removing multiple items from the map in one shot.
                myMap.keySet().removeAll(mapKeysToRemoveSet);

                System.debug(JSON.serialize(myMap));





                share|improve this answer


























                  7












                  7








                  7







                  Yep, that's the expected behavior.



                  For simple maps, you can get rid of null values by iterating over the map keys, keeping track of which ones have null values, and then a little map manipulation.



                  Set<String> mapKeysToRemoveSet = new Set<String>();

                  for(String key :myMap.keySet()){
                  if(myMap.get(key) == null){
                  mapKeysToRemoveSet.add(key);
                  }
                  }

                  // The Map class only comes with a remove() method, which only removes one item from the
                  // map at a time.
                  // It's not a great idea to modify a collection while you're iterating over it.
                  // The solution is to get the map's keyset, then use the set class's removeAll() method.
                  // This has the effect of removing multiple items from the map in one shot.
                  myMap.keySet().removeAll(mapKeysToRemoveSet);

                  System.debug(JSON.serialize(myMap));





                  share|improve this answer













                  Yep, that's the expected behavior.



                  For simple maps, you can get rid of null values by iterating over the map keys, keeping track of which ones have null values, and then a little map manipulation.



                  Set<String> mapKeysToRemoveSet = new Set<String>();

                  for(String key :myMap.keySet()){
                  if(myMap.get(key) == null){
                  mapKeysToRemoveSet.add(key);
                  }
                  }

                  // The Map class only comes with a remove() method, which only removes one item from the
                  // map at a time.
                  // It's not a great idea to modify a collection while you're iterating over it.
                  // The solution is to get the map's keyset, then use the set class's removeAll() method.
                  // This has the effect of removing multiple items from the map in one shot.
                  myMap.keySet().removeAll(mapKeysToRemoveSet);

                  System.debug(JSON.serialize(myMap));






                  share|improve this answer












                  share|improve this answer



                  share|improve this answer










                  answered yesterday









                  Derek FDerek F

                  21k52353




                  21k52353























                      1














                      This is a problem which I had faced, and I came across a string manipulation method that strips out nulls from null json keys.



                        public static string stripJsonNulls(string JsonString)
                      {

                      if(JsonString != null)
                      {
                      JsonString = JsonString.replaceAll('"[^"]*":null',''); //basic removeal of null values
                      JsonString = JsonString.replaceAll(',{2,}', ','); //remove duplicate/multiple commas
                      JsonString = JsonString.replace('{,', '{'); //prevent opening brace from having a comma after it
                      JsonString = JsonString.replace(',}', '}'); //prevent closing brace from having a comma before it
                      JsonString = JsonString.replace('[,', '['); //prevent opening bracket from having a comma after it
                      JsonString = JsonString.replace(',]', ']'); //prevent closing bracket from having a comma before it
                      }

                      return JsonString;
                      }


                      Map<String, String> bodyMap = new Map<String, String> {'key'=>'value', 'key2'=>null};
                      System.debug(stripJsonNulls(JSON.serialize(bodyMap,false)));


                      OP : {"key":"value"}



                      Src: https://iwritecrappycode.wordpress.com/2014/07/16/stripping-nulls-from-a-json-object-in-apex/






                      share|improve this answer
























                      • You want to trust a site called "I Write Crappy Code?"

                        – corsiKa
                        yesterday











                      • 😛 what's in the name ~ Shakespeare

                        – Pranay Jaiswal
                        yesterday


















                      1














                      This is a problem which I had faced, and I came across a string manipulation method that strips out nulls from null json keys.



                        public static string stripJsonNulls(string JsonString)
                      {

                      if(JsonString != null)
                      {
                      JsonString = JsonString.replaceAll('"[^"]*":null',''); //basic removeal of null values
                      JsonString = JsonString.replaceAll(',{2,}', ','); //remove duplicate/multiple commas
                      JsonString = JsonString.replace('{,', '{'); //prevent opening brace from having a comma after it
                      JsonString = JsonString.replace(',}', '}'); //prevent closing brace from having a comma before it
                      JsonString = JsonString.replace('[,', '['); //prevent opening bracket from having a comma after it
                      JsonString = JsonString.replace(',]', ']'); //prevent closing bracket from having a comma before it
                      }

                      return JsonString;
                      }


                      Map<String, String> bodyMap = new Map<String, String> {'key'=>'value', 'key2'=>null};
                      System.debug(stripJsonNulls(JSON.serialize(bodyMap,false)));


                      OP : {"key":"value"}



                      Src: https://iwritecrappycode.wordpress.com/2014/07/16/stripping-nulls-from-a-json-object-in-apex/






                      share|improve this answer
























                      • You want to trust a site called "I Write Crappy Code?"

                        – corsiKa
                        yesterday











                      • 😛 what's in the name ~ Shakespeare

                        – Pranay Jaiswal
                        yesterday
















                      1












                      1








                      1







                      This is a problem which I had faced, and I came across a string manipulation method that strips out nulls from null json keys.



                        public static string stripJsonNulls(string JsonString)
                      {

                      if(JsonString != null)
                      {
                      JsonString = JsonString.replaceAll('"[^"]*":null',''); //basic removeal of null values
                      JsonString = JsonString.replaceAll(',{2,}', ','); //remove duplicate/multiple commas
                      JsonString = JsonString.replace('{,', '{'); //prevent opening brace from having a comma after it
                      JsonString = JsonString.replace(',}', '}'); //prevent closing brace from having a comma before it
                      JsonString = JsonString.replace('[,', '['); //prevent opening bracket from having a comma after it
                      JsonString = JsonString.replace(',]', ']'); //prevent closing bracket from having a comma before it
                      }

                      return JsonString;
                      }


                      Map<String, String> bodyMap = new Map<String, String> {'key'=>'value', 'key2'=>null};
                      System.debug(stripJsonNulls(JSON.serialize(bodyMap,false)));


                      OP : {"key":"value"}



                      Src: https://iwritecrappycode.wordpress.com/2014/07/16/stripping-nulls-from-a-json-object-in-apex/






                      share|improve this answer













                      This is a problem which I had faced, and I came across a string manipulation method that strips out nulls from null json keys.



                        public static string stripJsonNulls(string JsonString)
                      {

                      if(JsonString != null)
                      {
                      JsonString = JsonString.replaceAll('"[^"]*":null',''); //basic removeal of null values
                      JsonString = JsonString.replaceAll(',{2,}', ','); //remove duplicate/multiple commas
                      JsonString = JsonString.replace('{,', '{'); //prevent opening brace from having a comma after it
                      JsonString = JsonString.replace(',}', '}'); //prevent closing brace from having a comma before it
                      JsonString = JsonString.replace('[,', '['); //prevent opening bracket from having a comma after it
                      JsonString = JsonString.replace(',]', ']'); //prevent closing bracket from having a comma before it
                      }

                      return JsonString;
                      }


                      Map<String, String> bodyMap = new Map<String, String> {'key'=>'value', 'key2'=>null};
                      System.debug(stripJsonNulls(JSON.serialize(bodyMap,false)));


                      OP : {"key":"value"}



                      Src: https://iwritecrappycode.wordpress.com/2014/07/16/stripping-nulls-from-a-json-object-in-apex/







                      share|improve this answer












                      share|improve this answer



                      share|improve this answer










                      answered yesterday









                      Pranay JaiswalPranay Jaiswal

                      18.7k53158




                      18.7k53158













                      • You want to trust a site called "I Write Crappy Code?"

                        – corsiKa
                        yesterday











                      • 😛 what's in the name ~ Shakespeare

                        – Pranay Jaiswal
                        yesterday





















                      • You want to trust a site called "I Write Crappy Code?"

                        – corsiKa
                        yesterday











                      • 😛 what's in the name ~ Shakespeare

                        – Pranay Jaiswal
                        yesterday



















                      You want to trust a site called "I Write Crappy Code?"

                      – corsiKa
                      yesterday





                      You want to trust a site called "I Write Crappy Code?"

                      – corsiKa
                      yesterday













                      😛 what's in the name ~ Shakespeare

                      – Pranay Jaiswal
                      yesterday







                      😛 what's in the name ~ Shakespeare

                      – Pranay Jaiswal
                      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%2f257158%2fjson-serialize-is-it-possible-to-suppress-null-values-of-a-map%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

                      What other Star Trek series did the main TNG cast show up in?

                      Berlina muro

                      Berlina aerponto