diff --git a/src/main/java/org/json/JSONObject.java b/src/main/java/org/json/JSONObject.java index db2c2aac7..6b087eaba 100644 --- a/src/main/java/org/json/JSONObject.java +++ b/src/main/java/org/json/JSONObject.java @@ -3349,7 +3349,7 @@ public static T fromJson(String jsonString, Class clazz) { * of the given class. It supports basic data types including {@code int}, {@code double}, * {@code float}, {@code long}, and {@code boolean}, as well as their boxed counterparts. * The target class must have a no-argument constructor, and its field names must match - * the keys in the JSON string. + * the keys in the JSON string. Static fields are ignored. * *

Note: Only classes that are explicitly supported and registered within * the {@code JSONObject} context can be deserialized. If the provided class is not among those, @@ -3366,6 +3366,9 @@ public T fromJson(Class clazz) { try { T obj = clazz.getDeclaredConstructor().newInstance(); for (Field field : clazz.getDeclaredFields()) { + if (Modifier.isStatic(field.getModifiers())) { + continue; + } field.setAccessible(true); String fieldName = field.getName(); if (has(fieldName)) { diff --git a/src/test/java/org/json/junit/JSONObjectTest.java b/src/test/java/org/json/junit/JSONObjectTest.java index 5c1d1a2eb..6a3c9b573 100644 --- a/src/test/java/org/json/junit/JSONObjectTest.java +++ b/src/test/java/org/json/junit/JSONObjectTest.java @@ -66,6 +66,7 @@ import org.json.junit.data.CustomClassG; import org.json.junit.data.CustomClassH; import org.json.junit.data.CustomClassI; +import org.json.junit.data.CustomClassJ; import org.json.JSONObject; import org.junit.After; import org.junit.Ignore; @@ -4232,4 +4233,21 @@ public void jsonObjectParseFromJson_8() { CustomClassI compareClassI = new CustomClassI(dataList); assertEquals(customClassI.integerMap.toString(), compareClassI.integerMap.toString()); } + + @Test + public void jsonObjectParseFromJson_9() { + JSONObject object = new JSONObject(); + object.put("number", 12); + object.put("classState", "mutated"); + + String initialClassState = CustomClassJ.classState; + CustomClassJ.classState = "original"; + try { + CustomClassJ customClassJ = object.fromJson(CustomClassJ.class); + assertEquals(12, customClassJ.number); + assertEquals("original", CustomClassJ.classState); + } finally { + CustomClassJ.classState = initialClassState; + } + } } diff --git a/src/test/java/org/json/junit/data/CustomClassJ.java b/src/test/java/org/json/junit/data/CustomClassJ.java new file mode 100644 index 000000000..62cce3ea4 --- /dev/null +++ b/src/test/java/org/json/junit/data/CustomClassJ.java @@ -0,0 +1,10 @@ +package org.json.junit.data; + +public class CustomClassJ { + public static String classState = "original"; + public int number; + + public CustomClassJ() { + // Required for JSONObject#fromJson(Class) tests. + } +}