Skip to content

Commit ee0a9e1

Browse files
committed
prefer setter
1 parent 026af26 commit ee0a9e1

File tree

4 files changed

+44
-54
lines changed

4 files changed

+44
-54
lines changed

src/main/java/com/jsoniter/CodegenImplObjectStrict.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -191,6 +191,9 @@ private static int assignMaskForRequiredProperties(List<Binding> allBindings) {
191191
}
192192

193193
private static String updateBindingSetOp(String rendered, Binding binding) {
194+
if (binding.fromNames.length == 0) {
195+
return rendered;
196+
}
194197
while (true) {
195198
String marker = "_" + binding.name + "_";
196199
int start = rendered.indexOf(marker);

src/main/java/com/jsoniter/ReflectionObjectDecoder.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@ public Decoder create() {
103103
if (desc.bindingTypeWrappers.isEmpty()) {
104104
return new OnlyField();
105105
} else {
106-
return new WithSetter();
106+
return new WithWrapper();
107107
}
108108
} else {
109109
return new WithCtor();
@@ -249,7 +249,7 @@ private Object decode_(JsonIterator iter) throws Exception {
249249
}
250250
}
251251

252-
public class WithSetter implements Decoder {
252+
public class WithWrapper implements Decoder {
253253

254254
@Override
255255
public Object decode(JsonIterator iter) throws IOException {

src/main/java/com/jsoniter/spi/ClassDescriptor.java

Lines changed: 21 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -113,71 +113,45 @@ public static ClassDescriptor getEncodingClassDescriptor(ClassInfo classInfo, bo
113113
return desc;
114114
}
115115

116-
// TODO: do not remove, set fromNames to []
117116
private static void decodingDeduplicate(ClassDescriptor desc) {
118-
HashMap<String, Binding> byName = new HashMap<String, Binding>();
117+
HashMap<String, Binding> byFromName = new HashMap<String, Binding>();
118+
HashMap<String, Binding> byFieldName = new HashMap<String, Binding>();
119119
for (Binding field : desc.fields) {
120120
for (String fromName : field.fromNames) {
121-
if (byName.containsKey(fromName)) {
121+
if (byFromName.containsKey(fromName)) {
122122
throw new JsonException("field decode from same name: " + fromName);
123123
}
124-
byName.put(fromName, field);
124+
byFromName.put(fromName, field);
125125
}
126+
byFieldName.put(field.name, field);
126127
}
127128
ArrayList<Binding> iteratingSetters = new ArrayList<Binding>(desc.setters);
128129
Collections.reverse(iteratingSetters);
129130
for (Binding setter : iteratingSetters) {
130-
for (String fromName : setter.fromNames) {
131-
Binding existing = byName.get(fromName);
132-
if (existing == null) {
133-
byName.put(fromName, setter);
134-
continue;
135-
}
136-
if (desc.fields.remove(existing)) {
137-
continue;
138-
}
139-
if (existing.method != null && existing.method.getName().equals(setter.method.getName())) {
140-
// inherited interface setter
141-
// iterate in reverse order, so that the setter from child class will be kept
142-
desc.setters.remove(existing);
143-
continue;
144-
}
145-
throw new JsonException("setter decode from same name: " + fromName);
131+
Binding existing = byFieldName.get(setter.name);
132+
if (existing != null) {
133+
existing.fromNames = new String[0];
146134
}
135+
deduplicateByFromName(byFromName, setter);
147136
}
148137
for (WrapperDescriptor wrapper : desc.bindingTypeWrappers) {
149138
for (Binding param : wrapper.parameters) {
150-
for (String fromName : param.fromNames) {
151-
Binding existing = byName.get(fromName);
152-
if (existing == null) {
153-
byName.put(fromName, param);
154-
continue;
155-
}
156-
if (desc.fields.remove(existing)) {
157-
continue;
158-
}
159-
if (desc.setters.remove(existing)) {
160-
continue;
161-
}
162-
throw new JsonException("wrapper parameter decode from same name: " + fromName);
163-
}
139+
deduplicateByFromName(byFromName, param);
164140
}
165141
}
166142
for (Binding param : desc.ctor.parameters) {
167-
for (String fromName : param.fromNames) {
168-
Binding existing = byName.get(fromName);
169-
if (existing == null) {
170-
byName.put(fromName, param);
171-
continue;
172-
}
173-
if (desc.fields.remove(existing)) {
174-
continue;
175-
}
176-
if (desc.setters.remove(existing)) {
177-
continue;
178-
}
179-
throw new JsonException("ctor parameter decode from same name: " + fromName);
143+
deduplicateByFromName(byFromName, param);
144+
}
145+
}
146+
147+
private static void deduplicateByFromName(Map<String, Binding> byFromName, Binding setter) {
148+
for (String fromName : setter.fromNames) {
149+
Binding existing = byFromName.get(fromName);
150+
if (existing == null) {
151+
byFromName.put(fromName, setter);
152+
continue;
180153
}
154+
existing.fromNames = new String[0];
181155
}
182156
}
183157

src/test/java/com/jsoniter/TestObject.java

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,6 @@
33
import com.jsoniter.annotation.JsonProperty;
44
import com.jsoniter.any.Any;
55
import com.jsoniter.fuzzy.MaybeEmptyArrayDecoder;
6-
import com.jsoniter.output.EncodingMode;
7-
import com.jsoniter.output.JsonStream;
8-
import com.jsoniter.spi.Config;
96
import com.jsoniter.spi.EmptyExtension;
107
import com.jsoniter.spi.JsonException;
118
import com.jsoniter.spi.JsoniterSpi;
@@ -38,7 +35,7 @@ public void test_empty_object() throws IOException {
3835
assertNull(simpleObj.field1);
3936
iter.reset(iter.buf);
4037
Object obj = iter.read(Object.class);
41-
assertEquals(0, ((Map)obj).size());
38+
assertEquals(0, ((Map) obj).size());
4239
iter.reset(iter.buf);
4340
Any any = iter.readAny();
4441
assertEquals(0, any.size());
@@ -58,7 +55,7 @@ public void test_one_field() throws IOException {
5855
assertEquals("hello", any.toString("field1"));
5956
assertEquals(ValueType.INVALID, any.get("field2").valueType());
6057
iter.reset(iter.buf);
61-
assertEquals("hello", ((Map)iter.read()).get("field1"));
58+
assertEquals("hello", ((Map) iter.read()).get("field1"));
6259
}
6360

6461
public void test_two_fields() throws IOException {
@@ -168,6 +165,7 @@ public enum MyEnum {
168165
WORLD,
169166
WOW
170167
}
168+
171169
public MyEnum field1;
172170
}
173171

@@ -224,6 +222,7 @@ private static class PrivateSub extends PublicSuper {
224222

225223
public static class TestObject7 {
226224
public PrivateSub field1;
225+
227226
public void setFieldXXX(PrivateSub obj) {
228227
}
229228
}
@@ -233,6 +232,20 @@ public void test_private_ref() throws IOException {
233232
assertNull(obj.field1);
234233
}
235234

235+
public static class TestObject8 {
236+
public String field1;
237+
238+
@JsonProperty(from = {"field-1"})
239+
public void setField1(String obj) {
240+
field1 = "!!!" + obj;
241+
}
242+
}
243+
244+
public void test_setter_is_preferred() throws IOException {
245+
TestObject8 obj = JsonIterator.deserialize("{\"field-1\":\"hello\"}", TestObject8.class);
246+
assertEquals("!!!hello", obj.field1);
247+
}
248+
236249
public void skip_object_lazy_any_to_string() {
237250
Any any = JsonIterator.deserialize("{\"field1\":1,\"field2\":2,\"field3\":3}");
238251
any.asMap().put("field4", Any.wrap(4));

0 commit comments

Comments
 (0)