From 8babe3ed17a894a686ecc8446d8568123ecf44de Mon Sep 17 00:00:00 2001 From: "shaojin.wensj" Date: Wed, 5 Oct 2022 00:49:33 +0800 Subject: [PATCH] improved fastjson 1.x compatbile, support ExtraProcessor, for issue #583 --- .../fastjson2/reader/ObjectReaderAdapter.java | 2 +- .../fastjson2/reader/ObjectReaderBean.java | 12 ++-------- .../reader/ObjectReaderCreatorASM.java | 11 +++++++-- .../ObjectReaderNoneDefaultConstructor.java | 4 ++-- .../v1issues/issue_1200/Issue1271.java | 23 +++++++++++++++++++ 5 files changed, 37 insertions(+), 15 deletions(-) diff --git a/core/src/main/java/com/alibaba/fastjson2/reader/ObjectReaderAdapter.java b/core/src/main/java/com/alibaba/fastjson2/reader/ObjectReaderAdapter.java index 59ff632943..a19ca76c8c 100644 --- a/core/src/main/java/com/alibaba/fastjson2/reader/ObjectReaderAdapter.java +++ b/core/src/main/java/com/alibaba/fastjson2/reader/ObjectReaderAdapter.java @@ -377,7 +377,7 @@ public T readJSONBObject(JSONReader jsonReader, Type fieldType, Object fieldName } } if (fieldReader == null) { - jsonReader.skipValue(); + processExtra(jsonReader, object); continue; } diff --git a/core/src/main/java/com/alibaba/fastjson2/reader/ObjectReaderBean.java b/core/src/main/java/com/alibaba/fastjson2/reader/ObjectReaderBean.java index b9a668c456..69c233439f 100644 --- a/core/src/main/java/com/alibaba/fastjson2/reader/ObjectReaderBean.java +++ b/core/src/main/java/com/alibaba/fastjson2/reader/ObjectReaderBean.java @@ -170,11 +170,7 @@ public void readObject(JSONReader jsonReader, Object object, long features) { } if (fieldReader == null) { - if (this instanceof ObjectReaderBean) { - processExtra(jsonReader, object); - } else { - jsonReader.skipValue(); - } + processExtra(jsonReader, object); continue; } @@ -298,11 +294,7 @@ public T readObject(JSONReader jsonReader, Type fieldType, Object fieldName, lon } if (fieldReader == null) { - if (this instanceof ObjectReaderBean) { - processExtra(jsonReader, object); - } else { - jsonReader.skipValue(); - } + processExtra(jsonReader, object); continue; } diff --git a/core/src/main/java/com/alibaba/fastjson2/reader/ObjectReaderCreatorASM.java b/core/src/main/java/com/alibaba/fastjson2/reader/ObjectReaderCreatorASM.java index 27409b0b9f..d1b5124f8c 100644 --- a/core/src/main/java/com/alibaba/fastjson2/reader/ObjectReaderCreatorASM.java +++ b/core/src/main/java/com/alibaba/fastjson2/reader/ObjectReaderCreatorASM.java @@ -1116,8 +1116,11 @@ private void genMethodReadJSONBObject( mw.visitLabel(next_); } + mw.visitVarInsn(Opcodes.ALOAD, THIS); mw.visitVarInsn(Opcodes.ALOAD, JSON_READER); - mw.visitMethodInsn(Opcodes.INVOKEVIRTUAL, TYPE_JSON_READER, "skipValue", "()V", false); + mw.visitVarInsn(Opcodes.ALOAD, OBJECT); + mw.visitMethodInsn(Opcodes.INVOKEVIRTUAL, TYPE_OBJECT_READER_ADAPTER, "processExtra", METHOD_DESC_PROCESS_EXTRA, false); + mw.visitJumpInsn(Opcodes.GOTO, for_inc_i_); // continue } else { // use switch @@ -1227,8 +1230,12 @@ private void genMethodReadJSONBObject( mw.visitJumpInsn(Opcodes.GOTO, for_inc_i_); // continue mw.visitLabel(fieldReaderNull_); + + mw.visitVarInsn(Opcodes.ALOAD, THIS); mw.visitVarInsn(Opcodes.ALOAD, JSON_READER); - mw.visitMethodInsn(Opcodes.INVOKEVIRTUAL, TYPE_JSON_READER, "skipValue", "()V", false); + mw.visitVarInsn(Opcodes.ALOAD, OBJECT); + mw.visitMethodInsn(Opcodes.INVOKEVIRTUAL, TYPE_OBJECT_READER_ADAPTER, "processExtra", METHOD_DESC_PROCESS_EXTRA, false); + mw.visitJumpInsn(Opcodes.GOTO, for_inc_i_); // continue } diff --git a/core/src/main/java/com/alibaba/fastjson2/reader/ObjectReaderNoneDefaultConstructor.java b/core/src/main/java/com/alibaba/fastjson2/reader/ObjectReaderNoneDefaultConstructor.java index 20dbbba541..da89fceb5d 100644 --- a/core/src/main/java/com/alibaba/fastjson2/reader/ObjectReaderNoneDefaultConstructor.java +++ b/core/src/main/java/com/alibaba/fastjson2/reader/ObjectReaderNoneDefaultConstructor.java @@ -121,7 +121,7 @@ public T readJSONBObject(JSONReader jsonReader, Type fieldType, Object fieldName FieldReader fieldReader = getFieldReader(hashCode); if (fieldReader == null) { - jsonReader.skipValue(); + processExtra(jsonReader, null); continue; } @@ -270,7 +270,7 @@ public T readObject(JSONReader jsonReader, Type fieldType, Object fieldName, lon } if (fieldReader == null) { - jsonReader.skipValue(); + processExtra(jsonReader, null); continue; } diff --git a/core/src/test/java/com/alibaba/fastjson2/v1issues/issue_1200/Issue1271.java b/core/src/test/java/com/alibaba/fastjson2/v1issues/issue_1200/Issue1271.java index 99c1f2929a..8be73c32c1 100644 --- a/core/src/test/java/com/alibaba/fastjson2/v1issues/issue_1200/Issue1271.java +++ b/core/src/test/java/com/alibaba/fastjson2/v1issues/issue_1200/Issue1271.java @@ -1,6 +1,7 @@ package com.alibaba.fastjson2.v1issues.issue_1200; import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson2.JSONB; import com.alibaba.fastjson2.filter.ExtraProcessor; import org.junit.jupiter.api.Test; @@ -33,6 +34,28 @@ public void processExtra(Object object, String key, Object value) { assertEquals(2, count.intValue()); } + @Test + public void test_for_issue_jsonb() throws Exception { + String json = "{\"a\":1,\"b\":2}"; + byte[] jsonbBytes = JSON.parseObject(json).toJSONBBytes(); + + final AtomicInteger count = new AtomicInteger(0); + ExtraProcessor extraProcessor = new ExtraProcessor() { + public void processExtra(Object object, String key, Object value) { + System.out.println("setter not found, class " + object.getClass().getName() + ", property " + key); + count.incrementAndGet(); + } + }; + + A a = JSONB.parseObject(jsonbBytes, A.class, extraProcessor); + assertEquals(1, a.a); + assertEquals(1, count.intValue()); + + B b = JSON.parseObject(json, B.class, extraProcessor); + assertEquals(1, b.a); + assertEquals(2, count.intValue()); + } + public static class A { public int a; }