Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[QUESTION] fastjson升级到2后,方法签名变化问题 #446

Closed
FutureZM opened this issue Jun 9, 2022 · 8 comments
Closed

[QUESTION] fastjson升级到2后,方法签名变化问题 #446

FutureZM opened this issue Jun 9, 2022 · 8 comments
Labels
bug Something isn't working question Further information is requested
Milestone

Comments

@FutureZM
Copy link

FutureZM commented Jun 9, 2022

JSON.toJSONString方法签名变化问题

在fastjson1.x中可以通过 SerializeConfig,NameFilter,SerializerFeature 实现对序列化后的数据进行定制,如下列通过SerializeConfig配置驼峰体转下划线, 然后通过NameFilter对 序列化后的key进行修改,通过SerializerFeature指定某些缺省值的处理方式,请问在fastjson2中该如何处理呢?

    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    class Student{
        private String nameV1;
        private Integer ageB1;
        private String emptyC1;
    }
    
    // 样例代码
    Student test = new Student("z", 12, null);
    SerializeConfig config = new SerializeConfig();
    config.propertyNamingStrategy = PropertyNamingStrategy.SnakeCase;
    final NameFilter nameFilter = (o12, s, o1) -> {
        String res = s.substring(0, 1).toUpperCase();
        if (s.length() > 1) {
            res += s.substring(1);
        }
        return res;
    };
    String res = JSON.toJSONString(test, config, nameFilter, SerializerFeature.WriteNullStringAsEmpty);
    System.out.println(res);

@FutureZM FutureZM added the question Further information is requested label Jun 9, 2022
@wenshao wenshao added this to the 2.0.7 milestone Jun 9, 2022
@wenshao
Copy link
Member

wenshao commented Jun 9, 2022

你是希望单个类这样的NamingPolicy,还是所有的类输出都是这样NamingPolicy?

@wenshao
Copy link
Member

wenshao commented Jun 9, 2022

https://oss.sonatype.org/content/repositories/snapshots/com/alibaba/fastjson/2.0.7-SNAPSHOT/
2.0.7-SNAPSHOT版本中,支持如下的使用方式,能满足你的需求么?

    public void test() {
        Student test = new Student("z", 12, null);
        NameFilter nameFilter = NameFilter.of(PropertyNamingStrategy.UpperCamelCaseWithUnderScores);
        String res = JSON.toJSONString(test, nameFilter, JSONWriter.Feature.WriteNullStringAsEmpty);
        assertEquals("{\"Age_B1\":12,\"Name_V1\":\"z\"}", res);
    }

    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    static class Student{
        private String nameV1;
        private Integer ageB1;
        private String emptyC1;
    }

@FutureZM
Copy link
Author

FutureZM commented Jun 9, 2022

你是希望单个类这样的NamingPolicy,还是所有的类输出都是这样NamingPolicy?

是希望针对所有的类都输出这样的NamingPolicy的。如果只是针对单个类的话,可以使用您文档中的mix_in相关的操作处理别名。
在fastjson1.x 版本中,是tostring时通过传递config和nameFilter达成目的

@FutureZM
Copy link
Author

FutureZM commented Jun 9, 2022

https://oss.sonatype.org/content/repositories/snapshots/com/alibaba/fastjson/2.0.7-SNAPSHOT/ 2.0.7-SNAPSHOT版本中,支持如下的使用方式,能满足你的需求么?

    public void test() {
        Student test = new Student("z", 12, null);
        NameFilter nameFilter = NameFilter.of(PropertyNamingStrategy.UpperCamelCaseWithUnderScores);
        String res = JSON.toJSONString(test, nameFilter, JSONWriter.Feature.WriteNullStringAsEmpty);
        assertEquals("{\"Age_B1\":12,\"Name_V1\":\"z\"}", res);
    }

    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    static class Student{
        private String nameV1;
        private Integer ageB1;
        private String emptyC1;
    }

此种方式是可以实现上述例子中的这个需求。此外仍有一个疑问,就是是否可以实现1.x中的通过NameFilter进行某些定制化的需求,毕竟转成下划线+每一段首字母大写这个需求可能只是个例。

@wenshao
Copy link
Member

wenshao commented Jun 9, 2022

NameFilter是可以,但配置全局的PropertyNamingPolicy还没实现,我还没想好怎么实现

@wenshao wenshao added the bug Something isn't working label Jun 9, 2022
wenshao added a commit that referenced this issue Jun 9, 2022
@wenshao
Copy link
Member

wenshao commented Jun 9, 2022

https://oss.sonatype.org/content/repositories/snapshots/com/alibaba/fastjson/2.0.7-SNAPSHOT/

更新快照2.0.7-SNAPSHOT版本,已经兼容你原来的写法,不用改代码,如下:

  @Test
    public void test5() {
        Student test = new Student("z", 12, null);
        SerializeConfig config = new SerializeConfig();
        config.propertyNamingStrategy = PropertyNamingStrategy.SnakeCase;
        final NameFilter nameFilter = (o12, s, o1) -> {
            String res = s.substring(0, 1).toUpperCase();
            if (s.length() > 1) {
                res += s.substring(1);
            }
            return res;
        };
        String res = JSON.toJSONString(test, config, nameFilter, SerializerFeature.WriteNullStringAsEmpty);
        assertEquals("{\"Age_b1\":12,\"Name_v1\":\"z\"}", res);
    }

    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    static class Student{
        private String nameV1;
        private Integer ageB1;
        private String emptyC1;
    }

@FutureZM
Copy link
Author

https://oss.sonatype.org/content/repositories/snapshots/com/alibaba/fastjson/2.0.7-SNAPSHOT/

更新快照2.0.7-SNAPSHOT版本,已经兼容你原来的写法,不用改代码,如下:

  @Test
    public void test5() {
        Student test = new Student("z", 12, null);
        SerializeConfig config = new SerializeConfig();
        config.propertyNamingStrategy = PropertyNamingStrategy.SnakeCase;
        final NameFilter nameFilter = (o12, s, o1) -> {
            String res = s.substring(0, 1).toUpperCase();
            if (s.length() > 1) {
                res += s.substring(1);
            }
            return res;
        };
        String res = JSON.toJSONString(test, config, nameFilter, SerializerFeature.WriteNullStringAsEmpty);
        assertEquals("{\"Age_b1\":12,\"Name_v1\":\"z\"}", res);
    }

    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    static class Student{
        private String nameV1;
        private Integer ageB1;
        private String emptyC1;
    }

收到,辛苦辛苦

@wenshao
Copy link
Member

wenshao commented Jun 11, 2022

https://github.com/alibaba/fastjson2/releases/tag/2.0.7
问题已经修复,请用新版本

@wenshao wenshao closed this as completed Jun 11, 2022
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working question Further information is requested
Projects
None yet
Development

No branches or pull requests

2 participants