# JsonIOException in system.net.httpClient

**URL:** <https://forum.inductiveautomation.com/t/jsonioexception-in-system-net-httpclient/95228>\
**Category:** Ignition\
**Tags:** vision, ignition81, scripting\
**Created:** [August 27, 2024, 6:49pm UTC](https://forum.inductiveautomation.com/t/jsonioexception-in-system-net-httpclient/95228 "2024-08-27T18:49:54Z")\
**Posts on this page:** 15\
**Page:** 1

<div class="post-metadata">

**Author:** ![pturmel](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/pturmel/32/3295_2.png) [@pturmel](https://forum.inductiveautomation.com/u/pturmel)\
**Post date:** [August 27, 2024, 6:49pm UTC](https://forum.inductiveautomation.com/t/jsonioexception-in-system-net-httpclient/95228/1 "2024-08-27T18:49:54Z")

</div>

Hmm. Has anyone run into this one?

```python
com.inductiveautomation.ignition.common.gson.JsonIOException: Failed making field 'java.lang.ref.Reference#referent' accessible; either increase its visibility or write a custom TypeAdapter for its declaring type.
	at com.inductiveautomation.ignition.common.gson.internal.reflect.ReflectionHelper.makeAccessible(ReflectionHelper.java:38)
	at com.inductiveautomation.ignition.common.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:286)
	at com.inductiveautomation.ignition.common.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:130)
	at com.inductiveautomation.ignition.common.gson.Gson.getAdapter(Gson.java:556)
	at com.inductiveautomation.ignition.common.gson.internal.bind.CollectionTypeAdapterFactory.create(CollectionTypeAdapterFactory.java:53)
	at com.inductiveautomation.ignition.common.gson.Gson.getAdapter(Gson.java:556)
	at com.inductiveautomation.ignition.common.gson.internal.bind.ReflectiveTypeAdapterFactory.createBoundField(ReflectiveTypeAdapterFactory.java:160)
	at com.inductiveautomation.ignition.common.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:294)
	at com.inductiveautomation.ignition.common.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:130)
	at com.inductiveautomation.ignition.common.gson.Gson.getAdapter(Gson.java:556)
	at com.inductiveautomation.ignition.common.gson.internal.bind.ReflectiveTypeAdapterFactory.createBoundField(ReflectiveTypeAdapterFactory.java:160)
	at com.inductiveautomation.ignition.common.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:294)
	at com.inductiveautomation.ignition.common.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:130)
	at com.inductiveautomation.ignition.common.gson.Gson.getAdapter(Gson.java:556)
	at com.inductiveautomation.ignition.common.gson.internal.bind.ArrayTypeAdapter$1.create(ArrayTypeAdapter.java:45)
	at com.inductiveautomation.ignition.common.gson.Gson.getAdapter(Gson.java:556)
	at com.inductiveautomation.ignition.common.gson.internal.bind.ReflectiveTypeAdapterFactory.createBoundField(ReflectiveTypeAdapterFactory.java:160)
	at com.inductiveautomation.ignition.common.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:294)
	at com.inductiveautomation.ignition.common.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:130)
	at com.inductiveautomation.ignition.common.gson.Gson.getAdapter(Gson.java:556)
	at com.inductiveautomation.ignition.common.gson.Gson.toJson(Gson.java:834)
	at com.inductiveautomation.ignition.common.gson.Gson.toJsonTree(Gson.java:712)
	at com.inductiveautomation.ignition.common.gson.Gson.toJsonTree(Gson.java:689)
	at com.inductiveautomation.ignition.common.TypeUtilities.pyToGson(TypeUtilities.java:2068)
	at com.inductiveautomation.ignition.common.TypeUtilities.pyToGson(TypeUtilities.java:2050)
	at com.inductiveautomation.ignition.common.script.builtin.http.JythonHttpClient.lambda$buildRequest$7(JythonHttpClient.java:234)
	at java.base/java.util.Optional.ifPresentOrElse(Unknown Source)
	at com.inductiveautomation.ignition.common.script.builtin.http.JythonHttpClient.buildRequest(JythonHttpClient.java:198)
	at com.inductiveautomation.ignition.common.script.builtin.http.JythonHttpClient.post(JythonHttpClient.java:320)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	at java.base/java.lang.reflect.Method.invoke(Unknown Source)
	at org.python.core.PyReflectedFunction. __call__ (PyReflectedFunction.java:190)
	at org.python.core.PyObject. __call__ (PyObject.java:422)
	at org.python.core.PyMethod.instancemethod ___call__ (PyMethod.java:237)
	at org.python.core.PyMethod. __call__ (PyMethod.java:228)
	at org.python.pycode._pyx8.apiPost$5(<module:licensing>:52)
	at org.python.pycode._pyx8.call_function(<module:licensing>)
	at org.python.core.PyTableCode.call(PyTableCode.java:173)
	at org.python.core.PyBaseCode.call(PyBaseCode.java:306)
	at org.python.core.PyFunction.function ___call__ (PyFunction.java:474)
	at org.python.core.PyFunction. __call__ (PyFunction.java:469)
	at org.python.core.PyFunction. __call__ (PyFunction.java:464)
	at org.python.core.PyObject._callextra(PyObject.java:589)
	at org.python.pycode._pyx9.callAsyncInvoked$16(<module:later>:173)
	at org.python.pycode._pyx9.call_function(<module:later>)
	at org.python.core.PyTableCode.call(PyTableCode.java:173)
	at org.python.core.PyBaseCode.call(PyBaseCode.java:306)
	at org.python.core.PyFunction.function ___call__ (PyFunction.java:474)
	at org.python.core.PyFunction. __call__ (PyFunction.java:469)
	at org.python.core.PyFunction. __call__ (PyFunction.java:464)
	at com.inductiveautomation.ignition.common.script.ScriptManager.runFunction(ScriptManager.java:847)
	at com.inductiveautomation.ignition.client.script.DesignerSystemUtilities.lambda$_invokeAsyncImpl$1(DesignerSystemUtilities.java:140)
	at java.base/java.lang.Thread.run(Unknown Source)
Caused by: java.lang.reflect.InaccessibleObjectException: Unable to make field private java.lang.Object java.lang.ref.Reference.referent accessible: module java.base does not "opens java.lang.ref" to unnamed module @31fe31d4
	at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(Unknown Source)
	at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(Unknown Source)
	at java.base/java.lang.reflect.Field.checkCanSetAccessible(Unknown Source)
	at java.base/java.lang.reflect.Field.setAccessible(Unknown Source)
	at com.inductiveautomation.ignition.common.gson.internal.reflect.ReflectionHelper.makeAccessible(ReflectionHelper.java:35)
	... 54 common frames omitted

```

Calling `.post()` on an httpClient shared instance.

Ignition v8.1.38.

Just upgraded this instance from v8.1.28 to a get away from a PMITextArea bug. ☹

---

<div class="post-metadata">

**Author:** ![Kevin.Herron](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/kevin.herron/32/7259_2.png) [@Kevin.Herron](https://forum.inductiveautomation.com/u/Kevin.Herron)\
**Post date:** [August 27, 2024, 6:56pm UTC](https://forum.inductiveautomation.com/t/jsonioexception-in-system-net-httpclient/95228/2 "2024-08-27T18:56:18Z")

</div>

What data are you posting?

Your upgrade has moved you from JDK 11 to JDK 17.

It seems you're posting something that has an object that GSON was once able to reflectively serialize but now cannot because JDK 17 stopped allowing illegal reflection access without the explicit `--add-opens` for that package.

---

<div class="post-metadata">

**Author:** ![pturmel](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/pturmel/32/3295_2.png) [@pturmel](https://forum.inductiveautomation.com/u/pturmel)\
**Post date:** [August 27, 2024, 7:12pm UTC](https://forum.inductiveautomation.com/t/jsonioexception-in-system-net-httpclient/95228/3 "2024-08-27T19:12:04Z")

</div>

I was letting httpClient turn a simple dictionary into json.

Further debugging with `system.util.jsonEncode()` gave me a stack overflow.

I've since found a code typo that put a non-string entry in that dictionary. (Jython's built-in license?) Still investigating.

Jython's `json.dumps` gave my the type error that led to the typo.

Will report more when I understand what was/is happening.

---

<div class="post-metadata">

**Author:** ![pturmel](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/pturmel/32/3295_2.png) [@pturmel](https://forum.inductiveautomation.com/u/pturmel)\
**Post date:** [August 27, 2024, 7:13pm UTC](https://forum.inductiveautomation.com/t/jsonioexception-in-system-net-httpclient/95228/4 "2024-08-27T19:13:10Z")

</div>

> [@Kevin.Herron](#):
>
> Your upgrade has moved you from JDK 11 to JDK 17.

Yeah, I expected that. And I cleared the `.ignition/cache` for this target. Surprised that a `system` function could trigger this reflection error.

---

<div class="post-metadata">

**Author:** ![Kevin.Herron](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/kevin.herron/32/7259_2.png) [@Kevin.Herron](https://forum.inductiveautomation.com/u/Kevin.Herron)\
**Post date:** [August 27, 2024, 7:14pm UTC](https://forum.inductiveautomation.com/t/jsonioexception-in-system-net-httpclient/95228/5 "2024-08-27T19:14:33Z")

</div>

> [@pturmel](#):
>
> Surprised that a `system` function could trigger this reflection error.

Meh, this system function accepts arbitrary user data and tries to serialize it into JSON.

---

<div class="post-metadata">

**Author:** ![pturmel](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/pturmel/32/3295_2.png) [@pturmel](https://forum.inductiveautomation.com/u/pturmel)\
**Post date:** [August 27, 2024, 7:15pm UTC](https://forum.inductiveautomation.com/t/jsonioexception-in-system-net-httpclient/95228/6 "2024-08-27T19:15:40Z")

</div>

My gateway `ignition.conf` has these:

```python
wrapper.java.additional.16=--add-opens=java.base/java.lang=ALL-UNNAMED
wrapper.java.additional.17=--add-opens=java.base/java.security.cert=ALL-UNNAMED
wrapper.java.additional.18=--add-opens=java.base/java.util=ALL-UNNAMED
wrapper.java.additional.19=--add-opens=java.base/jdk.internal.misc=ALL-UNNAMED
wrapper.java.additional.20=--add-opens=java.base/java.io=ALL-UNNAMED

```

Does the gateway hand such off to the designer and to Vision clients?

---

<div class="post-metadata">

**Author:** ![Kevin.Herron](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/kevin.herron/32/7259_2.png) [@Kevin.Herron](https://forum.inductiveautomation.com/u/Kevin.Herron)\
**Post date:** [August 27, 2024, 7:16pm UTC](https://forum.inductiveautomation.com/t/jsonioexception-in-system-net-httpclient/95228/7 "2024-08-27T19:16:57Z")

</div>

You may still need another line for `java.lang.ref`...

> [@pturmel](#):
>
> Does the gateway hand such off to the designer and to Vision clients?

I don't think so, but I also don't see any by default in the Designer Launcher, and I thought there was some place these were defined... @jcoffman whatcha say?

---

<div class="post-metadata">

**Author:** ![Kevin.Herron](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/kevin.herron/32/7259_2.png) [@Kevin.Herron](https://forum.inductiveautomation.com/u/Kevin.Herron)\
**Post date:** [August 27, 2024, 7:28pm UTC](https://forum.inductiveautomation.com/t/jsonioexception-in-system-net-httpclient/95228/8 "2024-08-27T19:28:05Z")

</div>

Ok, so it looks like Client/Designer get them from the launch manifest, but still haven't tracked down where those values come from...

---

<div class="post-metadata">

**Author:** ![Kevin.Herron](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/kevin.herron/32/7259_2.png) [@Kevin.Herron](https://forum.inductiveautomation.com/u/Kevin.Herron)\
**Post date:** [August 27, 2024, 7:31pm UTC](https://forum.inductiveautomation.com/t/jsonioexception-in-system-net-httpclient/95228/9 "2024-08-27T19:31:14Z")

</div>

Ahhhh, `$IGNITION/lib/runtime/client-exports.conf` and `client-opens.conf`.

---

<div class="post-metadata">

**Author:** ![jcoffman](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/jcoffman/32/6429_2.png) [@jcoffman](https://forum.inductiveautomation.com/u/jcoffman)\
**Post date:** [August 27, 2024, 7:59pm UTC](https://forum.inductiveautomation.com/t/jsonioexception-in-system-net-httpclient/95228/10 "2024-08-27T19:59:24Z")

</div>

also, fwiw, the client-exports.conf and client-opens.conf files in lib/runtime are owned and updated by IA, so the next bump to Ignition will result it your changes being discarded.

You can augment these files with your own files at `data/client-opens.conf` and `data/client-exports.conf` files.

so in this case add a file `data/client-opens.conf` which has the line

```python
java.base/java.lang.ref

```

This will be preserved across upgrades and be present for all new client and designer launches.

---

<div class="post-metadata">

**Author:** ![paul-griffith](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/paul-griffith/32/37249_2.png) [@paul-griffith](https://forum.inductiveautomation.com/u/paul-griffith)\
**Post date:** [August 27, 2024, 8:02pm UTC](https://forum.inductiveautomation.com/t/jsonioexception-in-system-net-httpclient/95228/11 "2024-08-27T20:02:48Z")

</div>

> [@pturmel](#):
>
> non-string entry in that dictionary

A non string key?

Would definitely be good to know the actual type/data.

---

<div class="post-metadata">

**Author:** ![Kevin.Herron](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/kevin.herron/32/7259_2.png) [@Kevin.Herron](https://forum.inductiveautomation.com/u/Kevin.Herron)\
**Post date:** [August 27, 2024, 8:11pm UTC](https://forum.inductiveautomation.com/t/jsonioexception-in-system-net-httpclient/95228/12 "2024-08-27T20:11:53Z")

</div>

> [@jcoffman](#):
>
> You can augment these files with your own files at `data/client-opens.conf` and `data/client-exports.conf` files.

I left this out of my post because there's a nice comment at the top of our files that explains this.

---

<div class="post-metadata">

**Author:** ![pturmel](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/pturmel/32/3295_2.png) [@pturmel](https://forum.inductiveautomation.com/u/pturmel)\
**Post date:** [August 27, 2024, 8:18pm UTC](https://forum.inductiveautomation.com/t/jsonioexception-in-system-net-httpclient/95228/13 "2024-08-27T20:18:08Z")

</div>

Well. Seems `license` is a magic keyword in jython. Try this:

```python
def testLicenseEncode():
	payload = {'somekey': 'someValue', 'license_key': license}
	print type(license)
	print system.util.jsonEncode(payload, 2)

testLicenseEncode()

```

Kaboom!

I'll let you all figure this one out.

---

<div class="post-metadata">

**Author:** ![Kevin.Herron](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/kevin.herron/32/7259_2.png) [@Kevin.Herron](https://forum.inductiveautomation.com/u/Kevin.Herron)\
**Post date:** [August 27, 2024, 8:23pm UTC](https://forum.inductiveautomation.com/t/jsonioexception-in-system-net-httpclient/95228/14 "2024-08-27T20:23:39Z")

</div>

```python
<class 'site._Printer'>

```

:hmm:

in `site.py`:

```python
class _Printer(object):
    """interactive prompt objects for printing the license text, a list of
    contributors and the copyright notice."""

```

:hmmmmmmmmm:

---

<div class="post-metadata">

**Author:** ![Kevin.Herron](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/kevin.herron/32/7259_2.png) [@Kevin.Herron](https://forum.inductiveautomation.com/u/Kevin.Herron)\
**Post date:** [August 27, 2024, 8:39pm UTC](https://forum.inductiveautomation.com/t/jsonioexception-in-system-net-httpclient/95228/15 "2024-08-27T20:39:21Z")

</div>

Yeah, `site.py` has this:

```python
def setcopyright():
    # ...
    __builtin__.license = _Printer(
        "license", "See http://www.python.org/%.3s/license.html" % sys.version,
        ["LICENSE.txt", "LICENSE"],
        [os.path.join(here, os.pardir), here, os.curdir])

```

which is called in a method called `main` which is called at the top level of that file 🤷
