Skip to content

Commit

Permalink
writeEnum default use name, for issue #1355
Browse files Browse the repository at this point in the history
  • Loading branch information
wenshao committed Apr 13, 2023
1 parent 075249d commit 357a128
Show file tree
Hide file tree
Showing 5 changed files with 80 additions and 33 deletions.
3 changes: 2 additions & 1 deletion core/src/main/java/com/alibaba/fastjson2/JSONWriter.java
Original file line number Diff line number Diff line change
Expand Up @@ -1867,7 +1867,8 @@ public enum Feature {
/**
* @since 2.0.20
*/
BrowserSecure(1L << 35);
BrowserSecure(1L << 35),
WriteEnumUsingOrdinal(1L << 36),;

public final long mask;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -196,7 +196,8 @@ public final void writeEnum(JSONWriter jsonWriter, Enum e) {
return;
}

final boolean usingOrdinal = (features & (JSONWriter.Feature.WriteEnumUsingToString.mask | JSONWriter.Feature.WriteEnumsUsingName.mask)) == 0;
final boolean usingOrdinal = (features & JSONWriter.Feature.WriteEnumUsingOrdinal.mask) != 0;
final boolean usingName = (features & JSONWriter.Feature.WriteEnumsUsingName.mask) != 0;
final boolean utf8 = jsonWriter.utf8;
final boolean utf16 = utf8 ? false : jsonWriter.utf16;
final int ordinal = e.ordinal();
Expand Down Expand Up @@ -233,37 +234,39 @@ public final void writeEnum(JSONWriter jsonWriter, Enum e) {
return;
}

if (utf8) {
byte[] bytes = valueNameCacheUTF8[ordinal];
if (usingName) {
if (utf8) {
byte[] bytes = valueNameCacheUTF8[ordinal];

if (bytes == null) {
byte[] nameUft8Bytes = enumConstants[ordinal].name().getBytes(StandardCharsets.UTF_8);
bytes = Arrays.copyOf(nameWithColonUTF8, nameWithColonUTF8.length + nameUft8Bytes.length + 2);
bytes[nameWithColonUTF8.length] = '"';
int index = nameWithColonUTF8.length + 1;
for (byte b : nameUft8Bytes) {
bytes[index++] = b;
if (bytes == null) {
byte[] nameUft8Bytes = enumConstants[ordinal].name().getBytes(StandardCharsets.UTF_8);
bytes = Arrays.copyOf(nameWithColonUTF8, nameWithColonUTF8.length + nameUft8Bytes.length + 2);
bytes[nameWithColonUTF8.length] = '"';
int index = nameWithColonUTF8.length + 1;
for (byte b : nameUft8Bytes) {
bytes[index++] = b;
}
bytes[bytes.length - 1] = '"';
valueNameCacheUTF8[ordinal] = bytes;
}
bytes[bytes.length - 1] = '"';
valueNameCacheUTF8[ordinal] = bytes;
jsonWriter.writeNameRaw(bytes);
return;
}
jsonWriter.writeNameRaw(bytes);
return;
}

if (utf16) {
char[] chars = valueNameCacheUTF16[ordinal];

if (chars == null) {
String name = enumConstants[ordinal].name();
chars = Arrays.copyOf(nameWithColonUTF16, nameWithColonUTF16.length + name.length() + 2);
chars[nameWithColonUTF16.length] = '"';
name.getChars(0, name.length(), chars, nameWithColonUTF16.length + 1);
chars[chars.length - 1] = '"';
valueNameCacheUTF16[ordinal] = chars;
if (utf16) {
char[] chars = valueNameCacheUTF16[ordinal];

if (chars == null) {
String name = enumConstants[ordinal].name();
chars = Arrays.copyOf(nameWithColonUTF16, nameWithColonUTF16.length + name.length() + 2);
chars[nameWithColonUTF16.length] = '"';
name.getChars(0, name.length(), chars, nameWithColonUTF16.length + 1);
chars[chars.length - 1] = '"';
valueNameCacheUTF16[ordinal] = chars;
}
jsonWriter.writeNameRaw(chars);
return;
}
jsonWriter.writeNameRaw(chars);
return;
}

if (jsonWriter.jsonb) {
Expand All @@ -272,7 +275,7 @@ public final void writeEnum(JSONWriter jsonWriter, Enum e) {
}

writeFieldName(jsonWriter);
jsonWriter.writeString(e.name());
jsonWriter.writeString(e.toString());
}

@Override
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package com.alibaba.fastjson2.issues_1000;

import com.alibaba.fastjson2.JSON;
import lombok.Builder;
import lombok.Data;
import org.junit.jupiter.api.Test;

public class Issue1355 {
@Test
public void test() {
System.out.println(
JSON.toJSONString(TestDTO.builder().testEnum(TestEnum.E1).build())
);
System.out.println(
com.alibaba.fastjson.JSON.toJSONString(TestDTO.builder().testEnum(TestEnum.E1).build())
);
System.out.println(
JSON.toJSONString(TestEnum.E1)
);
}

@Data
@Builder
public static class TestDTO {
private TestEnum testEnum;
}

public enum TestEnum {
E1, E2;
}
}
16 changes: 14 additions & 2 deletions core/src/test/java/com/alibaba/fastjson2/primitves/Enum_0.java
Original file line number Diff line number Diff line change
Expand Up @@ -69,15 +69,15 @@ public void test_feature() {
VO vo = new VO();
vo.setValue(Type.T0);
objectWriter.write(jsonWriter, vo);
assertEquals("{\"value\":0}",
assertEquals("{\"value\":\"T0\"}",
jsonWriter.toString());
}
{
JSONWriter jsonWriter = JSONWriter.ofUTF8();
VO vo = new VO();
vo.setValue(Type.T0);
objectWriter.write(jsonWriter, vo);
assertEquals("{\"value\":0}",
assertEquals("{\"value\":\"T0\"}",
jsonWriter.toString());
}

Expand Down Expand Up @@ -404,6 +404,18 @@ public void test_ascii() {
vo.setValue(id);
byte[] utf8Bytes = JSON.toJSONBytes(vo);

VO v1 = JSON.parseObject(utf8Bytes, 0, utf8Bytes.length, StandardCharsets.UTF_8, VO.class);
assertEquals(vo.getValue(), v1.getValue());
}
}

@Test
public void test_ordinal() {
for (Type id : types) {
VO vo = new VO();
vo.setValue(id);
byte[] utf8Bytes = JSON.toJSONBytes(vo, JSONWriter.Feature.WriteEnumUsingOrdinal);

VO v1 = JSON.parseObject(utf8Bytes, 0, utf8Bytes.length, StandardCharsets.US_ASCII, VO.class);
assertEquals(vo.getValue(), v1.getValue());
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,8 @@ public void test0() {
Bean bean = new Bean();
bean.unit = TimeUnit.DAYS;

assertEquals("{\"unit\":\"" + bean.unit.name() + "\"}", JSON.toJSONString(bean, JSONWriter.Feature.WriteEnumsUsingName));
assertEquals("{\"unit\":" + bean.unit.ordinal() + "}", JSON.toJSONString(bean));
assertEquals("{\"unit\":\"" + bean.unit.name() + "\"}", JSON.toJSONString(bean, JSONWriter.Feature.WriteEnumUsingToString));
assertEquals("{\"unit\":\"" + bean.unit.name() + "\"}", JSON.toJSONString(bean));

assertEquals(TimeUnit.DAYS, JSON.parseObject("{\"unit\":6}", Bean.class).unit);
assertEquals(TimeUnit.DAYS, JSON.parseObject("{\"unit\":6}").to(Bean.class).unit);
Expand Down

0 comments on commit 357a128

Please sign in to comment.