Behavior of JSONObject constructor trimming 0-led integers and converting them to int type instead of String type
Chưa có ai nhận issue này.
Đánh giá
- Độ khó
- 4/5
- Thời gian dự kiến
- 3-5 ngày
- Mức phù hợp với người mới
- 28/100
Hướng nghiên cứu
Start at the JSONObject constructor behavior changed in 20231013 and review the linked #783 diff. Reproduce the example with a leading-zero personId, then inspect how getString("personId") handles the resulting value. The issue does not define an agreed replacement behavior, so completion depends on resolving that compatibility question and adding coverage.
Do mô hình lập chỉ mục viết ra từ nội dung của issue.
Mô tả
Hello there! I am curious about the new behavior introduced in 20231013 (ref #783), where the JSONObject constructor trims 0-led integers and converts them to int type instead of String type (which was the type in 20230618).
While I can understand the rationale behind trimming, the change in behavior could be problematic for things like IDs with leading 0s, which may have previously relied on the JSONObject constructor preserving the value as String type, only to have it converted to int, and thus failing a subsequent call to JSONObject getString("id") because of type mismatch.
Comparing with other Java JSON libraries, org.json seems to behave in a way that's potentially unsafe as it transforms the input and therefore "hides" the error, versus the other libraries which take a safer approach by throwing an error on input (javax.json, Jackson) or treating the input as "pseudo"-json and letting the getter decide the type (Gson).
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.google.gson.JsonParser;
import org.json.JSONObject;
import org.junit.jupiter.api.Test;
import javax.json.Json;
import java.io.StringReader;
class MyTest {
@Test
void myTest() throws JsonProcessingException {
String personId = "0123";
// org.json transforms on construction
JSONObject j1 = new JSONObject("{personId: " + personId + "}");
System.out.println(j1.getString("personId")); // Throws exception
// javax.json throws error on construction
javax.json.JsonObject j2 = Json.createReader(new StringReader("{\"personId\": " + personId + "}")).readObject();
System.out.println(j2.getString("personId"));
// gson treats it as pseudo-json and leaves it to the getter to decide: getAsInt will trim, getAsString will not
com.google.gson.JsonObject j3 = JsonParser.parseString("{\"personId\": " + personId + "}").getAsJsonObject();
System.out.println(j3.get("personId").getAsString());
// jackson throws error on construction
JsonNode jsonNode = new ObjectMapper().readTree("{\"personId\": " + personId + "}");
System.out.println(jsonNode.get("personId").asText());
}
}
- Ngôn ngữ chính
- Java
- Star
- 4.7k
- Fork
- 2.6k
- Merge trung bình
- 6 ngày 20 giờ
- Pull request đã merge (30 ngày)
- 2
Hướng dẫn đóng góp
Bắt đầu từ đâu
- Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
- Bình luận trên issue rằng bạn sẽ nhận — tránh hai người làm cùng một việc.
- Fork repository và làm thay đổi trên một nhánh.
- Mở pull request có tham chiếu số hiệu của issue.
Issue khác của stleary/JSON-java
-
Fix before the next release
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 78/100
-
New JSONPointer tests needed Đang mở
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 76/100
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 88/100
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 82/100
-
Fix before the next release
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 78/100
Tất cả issue của stleary/JSON-java
Issue tương tự
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 65/100
-
Độ khó 1/5 Dưới một giờ Mức phù hợp với người mới 88/100
checkstyle/test-configs#263 ·
-
bug
Độ khó 1/5 Dưới một giờ Mức phù hợp với người mới 90/100
apache/cloudstack#14222 ·
-
[BUG]茶杯方块在取茶时会引发崩溃 Đang mở
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 88/100
-
Cannot differ own consent and managed consents in My Consents view and detailed consent view. Đang mở1.0.0-alpha2 Type/Improvement
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 68/100
wso2/dpdp-accelerator#272 ·