Uploaded image for project: 'Jenkins'
  1. Jenkins
  2. JENKINS-49669

readJSON returns non serializable JSON object

      When reading a json file or text the readJSON step returns a JSON object which is not serializable. Therfore usage in pipeline will fail in certain scenarios with:

      java.io.NotSerializableException: net.sf.json.JSONArray$JSONArrayListIterator
      	at org.jboss.marshalling.river.RiverMarshaller.doWriteObject(RiverMarshaller.java:860)
      	at org.jboss.marshalling.river.RiverMarshaller.doWriteFields(RiverMarshaller.java:1032)
      	at org.jboss.marshalling.river.RiverMarshaller.doWriteSerializableObject(RiverMarshaller.java:988)
      	at org.jboss.marshalling.river.RiverMarshaller.doWriteObject(RiverMarshaller.java:854)
      	at org.jboss.marshalling.river.RiverMarshaller.doWriteFields(RiverMarshaller.java:1032)
      	at org.jboss.marshalling.river.RiverMarshaller.doWriteSerializableObject(RiverMarshaller.java:988)
      	at org.jboss.marshalling.river.RiverMarshaller.doWriteObject(RiverMarshaller.java:854)
      	at org.jboss.marshalling.river.RiverMarshaller.doWriteFields(RiverMarshaller.java:1032)
      	at org.jboss.marshalling.river.RiverMarshaller.doWriteSerializableObject(RiverMarshaller.java:988)
      	at org.jboss.marshalling.river.RiverMarshaller.doWriteObject(RiverMarshaller.java:854)
      	at org.jboss.marshalling.river.RiverMarshaller.doWriteFields(RiverMarshaller.java:1032)
      	at org.jboss.marshalling.river.RiverMarshaller.doWriteSerializableObject(RiverMarshaller.java:988)
      	at org.jboss.marshalling.river.RiverMarshaller.doWriteSerializableObject(RiverMarshaller.java:967)
      	at org.jboss.marshalling.river.RiverMarshaller.doWriteObject(RiverMarshaller.java:854)
      	at org.jboss.marshalling.river.RiverMarshaller.doWriteFields(RiverMarshaller.java:1032)
      	at org.jboss.marshalling.river.RiverMarshaller.doWriteSerializableObject(RiverMarshaller.java:988)
      	at org.jboss.marshalling.river.RiverMarshaller.doWriteSerializableObject(RiverMarshaller.java:967)
      	at org.jboss.marshalling.river.RiverMarshaller.doWriteObject(RiverMarshaller.java:854)
      	at org.jboss.marshalling.river.RiverMarshaller.doWriteFields(RiverMarshaller.java:1032)
      	at org.jboss.marshalling.river.RiverMarshaller.doWriteSerializableObject(RiverMarshaller.java:988)
      	at org.jboss.marshalling.river.RiverMarshaller.doWriteSerializableObject(RiverMarshaller.java:967)
      	at org.jboss.marshalling.river.RiverMarshaller.doWriteObject(RiverMarshaller.java:854)
      	at org.jboss.marshalling.river.RiverMarshaller.doWriteFields(RiverMarshaller.java:1032)
      	at org.jboss.marshalling.river.RiverMarshaller.doWriteSerializableObject(RiverMarshaller.java:988)
      	at org.jboss.marshalling.river.RiverMarshaller.doWriteSerializableObject(RiverMarshaller.java:967)
      	at org.jboss.marshalling.river.RiverMarshaller.doWriteObject(RiverMarshaller.java:854)
      	at org.jboss.marshalling.river.RiverMarshaller.doWriteFields(RiverMarshaller.java:1032)
      	at org.jboss.marshalling.river.RiverMarshaller.doWriteSerializableObject(RiverMarshaller.java:988)
      	at org.jboss.marshalling.river.RiverMarshaller.doWriteSerializableObject(RiverMarshaller.java:967)
      	at org.jboss.marshalling.river.RiverMarshaller.doWriteObject(RiverMarshaller.java:854)
      	at org.jboss.marshalling.river.RiverMarshaller.doWriteFields(RiverMarshaller.java:1032)
      	at org.jboss.marshalling.river.RiverMarshaller.doWriteSerializableObject(RiverMarshaller.java:988)
      	at org.jboss.marshalling.river.RiverMarshaller.doWriteSerializableObject(RiverMarshaller.java:967)
      	at org.jboss.marshalling.river.RiverMarshaller.doWriteObject(RiverMarshaller.java:854)
      	at org.jboss.marshalling.river.RiverMarshaller.doWriteFields(RiverMarshaller.java:1032)
      	at org.jboss.marshalling.river.RiverMarshaller.doWriteSerializableObject(RiverMarshaller.java:988)
      	at org.jboss.marshalling.river.RiverMarshaller.doWriteSerializableObject(RiverMarshaller.java:967)
      	at org.jboss.marshalling.river.RiverMarshaller.doWriteObject(RiverMarshaller.java:854)
      	at org.jboss.marshalling.river.RiverMarshaller.doWriteFields(RiverMarshaller.java:1032)
      	at org.jboss.marshalling.river.RiverMarshaller.doWriteSerializableObject(RiverMarshaller.java:988)
      	at org.jboss.marshalling.river.RiverMarshaller.doWriteObject(RiverMarshaller.java:854)
      	at org.jboss.marshalling.river.BlockMarshaller.doWriteObject(BlockMarshaller.java:65)
      	at org.jboss.marshalling.river.BlockMarshaller.writeObject(BlockMarshaller.java:56)
      	at org.jboss.marshalling.MarshallerObjectOutputStream.writeObjectOverride(MarshallerObjectOutputStream.java:50)
      	at org.jboss.marshalling.river.RiverObjectOutputStream.writeObjectOverride(RiverObjectOutputStream.java:179)
      	at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:344)
      	at java.util.TreeMap.writeObject(TreeMap.java:2438)
      	at sun.reflect.GeneratedMethodAccessor256.invoke(Unknown Source)
      	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
      	at java.lang.reflect.Method.invoke(Method.java:498)
      	at org.jboss.marshalling.reflect.SerializableClass.callWriteObject(SerializableClass.java:271)
      	at org.jboss.marshalling.river.RiverMarshaller.doWriteSerializableObject(RiverMarshaller.java:976)
      	at org.jboss.marshalling.river.RiverMarshaller.doWriteObject(RiverMarshaller.java:854)
      	at org.jboss.marshalling.river.RiverMarshaller.doWriteFields(RiverMarshaller.java:1032)
      	at org.jboss.marshalling.river.RiverMarshaller.doWriteSerializableObject(RiverMarshaller.java:988)
      	at org.jboss.marshalling.river.RiverMarshaller.doWriteObject(RiverMarshaller.java:854)
      	at org.jboss.marshalling.AbstractObjectOutput.writeObject(AbstractObjectOutput.java:58)
      	at org.jboss.marshalling.AbstractMarshaller.writeObject(AbstractMarshaller.java:111)
      	at org.jenkinsci.plugins.workflow.support.pickles.serialization.RiverWriter.writeObject(RiverWriter.java:132)
      	at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup.saveProgram(CpsThreadGroup.java:453)
      	at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup.saveProgram(CpsThreadGroup.java:427)
      	at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup.saveProgramIfPossible(CpsThreadGroup.java:415)
      	at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup.run(CpsThreadGroup.java:360)
      	at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup.access$100(CpsThreadGroup.java:80)
      	at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup$2.call(CpsThreadGroup.java:240)
      	at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup$2.call(CpsThreadGroup.java:228)
      	at org.jenkinsci.plugins.workflow.cps.CpsVmExecutorService$2.call(CpsVmExecutorService.java:64)
      	at java.util.concurrent.FutureTask.run(FutureTask.java:266)
      	at hudson.remoting.SingleLaneExecutorService$1.run(SingleLaneExecutorService.java:131)
      	at jenkins.util.ContextResettingExecutorService$1.run(ContextResettingExecutorService.java:28)
      	at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
      	at java.util.concurrent.FutureTask.run(FutureTask.java:266)
      	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
      	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
      	at java.lang.Thread.run(Thread.java:748)
      

          [JENKINS-49669] readJSON returns non serializable JSON object

          Oleg Nenashev added a comment - - edited

          IIUC it has been introduced by 2.102 as a part of the blacklist hardening: https://github.com/jenkinsci/remoting/pull/208
          Although it is not exactly JEP-200, I will mark it with this label so that people know about regressions

          *UPD*: Or maybe not

          Oleg Nenashev added a comment - - edited IIUC it has been introduced by 2.102 as a part of the blacklist hardening: https://github.com/jenkinsci/remoting/pull/208 Although it is not exactly JEP-200, I will mark it with this label so that people know about regressions * UPD *: Or maybe not

          Oleg Nenashev added a comment -

          tmair Which version do you use?

          Oleg Nenashev added a comment - tmair Which version do you use?

          Thomas Mair added a comment -

          We are using version 1.4.1

           

          I also guess the bug is part of the library from the beginning

          Thomas Mair added a comment - We are using version 1.4.1   I also guess the bug is part of the library from the beginning

          Oleg Nenashev added a comment -

          It is AFAICT. You are on Jenkins 2.102+, right?

          Oleg Nenashev added a comment - It is AFAICT. You are on Jenkins 2.102+, right?

          Oleg Nenashev added a comment -

          jglick says that JBoss Marshalling does not use Blacklists from Remoting, so it is not a JEP-200 regression.

          Most likely there is just an iteration over JSONArray in the Pipeline script. According to jglick, there is a special IteratorHack class in Pipeline for lists to support "for (elem in jsonArray)", but probably it does not work for arrays.

          I will remove JEP-200 label and assign to Pipeline team for triaging

          Oleg Nenashev added a comment - jglick says that JBoss Marshalling does not use Blacklists from Remoting, so it is not a JEP-200 regression. Most likely there is just an iteration over JSONArray in the Pipeline script. According to jglick , there is a special IteratorHack class in Pipeline for lists to support "for (elem in jsonArray)", but probably it does not work for arrays. I will remove JEP-200 label and assign to Pipeline team for triaging

          Thomas Mair added a comment -

          My Jenkins version is 2.105.

          And yes I am iterating over a json array in one of my pipeline scripts.

          So would be iterating over the json array with the help of a classical for loop in a @NonCPS annotated function work as a temporary workaround for the issue?

          Thomas Mair added a comment - My Jenkins version is 2.105. And yes I am iterating over a json array in one of my pipeline scripts. So would be iterating over the json array with the help of a classical for loop in a @NonCPS annotated function work as a temporary workaround for the issue?

          Oleg Nenashev added a comment -

          IIUC it would. Assigned to Pipeline maintainers for further triage

          Oleg Nenashev added a comment - IIUC it would. Assigned to Pipeline maintainers for further triage

          Jesse Glick added a comment -

          You could either use whatever syntax you like inside a @NonCPS method, or use a C-style for-loop (with index) anywhere.

          Jesse Glick added a comment - You could either use whatever syntax you like inside a @NonCPS method, or use a C-style for -loop (with index) anywhere.

          Jesse Glick added a comment -

          BTW I would suggest that readJSON be deprecated and replaced with something which does the JSON parsing but then actually returns a plain old mixture of ArrayList, HashMap, String, and primitive wrappers.

          Jesse Glick added a comment - BTW I would suggest that readJSON be deprecated and replaced with something which does the JSON parsing but then actually returns a plain old mixture of ArrayList , HashMap , String , and primitive wrappers.

            rsandell rsandell
            tmair Thomas Mair
            Votes:
            0 Vote for this issue
            Watchers:
            5 Start watching this issue

              Created:
              Updated: