
JDK 版本使用的 17 , 使用 JDK 11 , 也是一样的结果。
使用的 fast json:
1.x 版本使用的:
<dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.83</version> </dependency> 2.x 版本使用的:
<dependency> <groupId>com.alibaba.fastjson2</groupId> <artifactId>fastjson2</artifactId> <version>2.0.53</version> </dependency> 原始的 json 字符串如下, (用 bejson 校验过,是对的)
{ "ListBucketResult":{ "xmlns":"http://s3.amazonaws.com/doc/2006-03-01/", "Name":"a_name", "Prefix":"", "Marker":"", "MaxKeys":1000, "IsTruncated":false, "Contents":[ { "Key":"E.jpg", "LastModified":"2024-11-01T13:09:17.000Z", "ETag":"\"tag-1\"", "Size":26579, "Owner":{ "ID":"xx1", "DisplayName":"c_name" }, "StorageClass":"STANDARD" }, { "Key":"地球.jpg", "LastModified":"2024-11-07T13:56:43.000Z", "ETag":"\"tag-2\"", "Size":26579, "Owner":{ "ID":"xx2", "DisplayName":"c_name" }, "StorageClass":"STANDARD" } ] } } 准备接收的实体如下:
package com.code.domain; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import java.io.Serializable; import java.util.List; @Data @NoArgsConstructor @AllArgsConstructor public class ListBucketResult implements Serializable { /** * 包装体 */ private ListBucketResultContent ListBucketResult; @Data @NoArgsConstructor @AllArgsConstructor public static class ListBucketResultContent implements Serializable { private String xmlns; private String name; private String prefix; private String marker; private int maxKeys; private boolean isTruncated; private List<Contents> contents; } @Data @NoArgsConstructor @AllArgsConstructor public static class Contents implements Serializable { private String key; private String lastModified; private String eTag; private int size; private Owner owner; private String storageClass; @Data @NoArgsConstructor @AllArgsConstructor public static class Owner { private String id; private String displayName; } } } 对 fastjson 1 测试类:
package com.code; import com.alibaba.fastjson.JSON; import com.code.s3xmlgateway.domain.ListBucketResult; import org.junit.jupiter.api.Test; public class Fast1Test { @Test public void testFast1() { String rawJsOnStr= "{\n" + "\t\"ListBucketResult\":{\n" + "\t\t\"xmlns\":\"http://s3.amazonaws.com/doc/2006-03-01/\",\n" + "\t\t\"Name\":\"a_name\",\n" + "\t\t\"Prefix\":\"\",\n" + "\t\t\"Marker\":\"\",\n" + "\t\t\"MaxKeys\":1000,\n" + "\t\t\"IsTruncated\":false,\n" + "\t\t\"Contents\":[\n" + "\t\t\t{\n" + "\t\t\t\t\"Key\":\"E.jpg\",\n" + "\t\t\t\t\"LastModified\":\"2024-11-01T13:09:17.000Z\",\n" + "\t\t\t\t\"ETag\":\"\\\"tag-1\\\"\",\n" + "\t\t\t\t\"Size\":26579,\n" + "\t\t\t\t\"Owner\":{\n" + "\t\t\t\t\t\"ID\":\"xx1\",\n" + "\t\t\t\t\t\"DisplayName\":\"c_name\"\n" + "\t\t\t\t},\n" + "\t\t\t\t\"StorageClass\":\"STANDARD\"\n" + "\t\t\t},\n" + "\t\t\t{\n" + "\t\t\t\t\"Key\":\"地球.jpg\",\n" + "\t\t\t\t\"LastModified\":\"2024-11-07T13:56:43.000Z\",\n" + "\t\t\t\t\"ETag\":\"\\\"tag-2\\\"\",\n" + "\t\t\t\t\"Size\":26579,\n" + "\t\t\t\t\"Owner\":{\n" + "\t\t\t\t\t\"ID\":\"xx2\",\n" + "\t\t\t\t\t\"DisplayName\":\"c_name\"\n" + "\t\t\t\t},\n" + "\t\t\t\t\"StorageClass\":\"STANDARD\"\n" + "\t\t\t}\n" + "\t\t]\n" + "\t}\n" + "}"; ListBucketResult listBucketResult = JSON.parseObject(rawJsonStr, ListBucketResult.class); System.out.println(listBucketResult); } } 运行结果:
ListBucketResult(ListBucketResult=ListBucketResult.ListBucketResultContent(xmlns=http://s3.amazonaws.com/doc/2006-03-01/, name=a_name, prefix=, marker=, maxKeys=1000, isTruncated=false, cOntents=[ListBucketResult.Contents(key=E.jpg, lastModified=2024-11-01T13:09:17.000Z, eTag="tag-1", size=26579, owner=com.code.s3xmlgateway.domain.ListBucketResult$Contents$Owner@188715b5, storageClass=STANDARD), ListBucketResult.Contents(key=地球.jpg, lastModified=2024-11-07T13:56:43.000Z, eTag="tag-2", size=26579, owner=com.code.s3xmlgateway.domain.ListBucketResult$Contents$Owner@1ea9f6af, storageClass=STANDARD)])) 如上可以看出,运行结果一切正常,可以正常解析为对象的值
针对 fastjson 2 的测试类:
package com.code; import com.alibaba.fastjson2.JSON; import com.code.s3xmlgateway.domain.ListBucketResult; import org.junit.jupiter.api.Test; public class Fast2Test { @Test public void testFast2() { String rawJsOnStr= "{\n" + "\t\"ListBucketResult\":{\n" + "\t\t\"xmlns\":\"http://s3.amazonaws.com/doc/2006-03-01/\",\n" + "\t\t\"Name\":\"a_name\",\n" + "\t\t\"Prefix\":\"\",\n" + "\t\t\"Marker\":\"\",\n" + "\t\t\"MaxKeys\":1000,\n" + "\t\t\IsTruncated\":false,\n" + "\t\t\"Contents\":[\n" + "\t\t\t{\n" + "\t\t\t\t\"Key\":\"E.jpg\",\n" + "\t\t\t\t\"LastModified\":\"2024-11-01T13:09:17.000Z\",\n" + "\t\t\t\t\"ETag\":\"\\\"tag-1\\\"\",\n" + "\t\t\t\t\"Size\":26579,\n" + "\t\t\t\t\"Owner\":{\n" + "\t\t\t\t\t\"ID\":\"xx1\",\n" + "\t\t\t\t\t\"DisplayName\":\"c_name\"\n" + "\t\t\t\t},\n" + "\t\t\t\t\"StorageClass\":\"STANDARD\"\n" + "\t\t\t},\n" + "\t\t\t{\n" + "\t\t\t\t\"Key\":\"地球.jpg\",\n" + "\t\t\t\t\"LastModified\":\"2024-11-07T13:56:43.000Z\",\n" + "\t\t\t\t\"ETag\":\"\\\"tag-2\\\"\",\n" + "\t\t\t\t\"Size\":26579,\n" + "\t\t\t\t\"Owner\":{\n" + "\t\t\t\t\t\"ID\":\"xx2\",\n" + "\t\t\t\t\t\"DisplayName\":\"c_name\"\n" + "\t\t\t\t},\n" + "\t\t\t\t\"StorageClass\":\"STANDARD\"\n" + "\t\t\t}\n" + "\t\t]\n" + "\t}\n" + "}"; ListBucketResult listBucketResult = JSON.parseObject(rawJsonStr, ListBucketResult.class); System.out.println(listBucketResult); } } 运行结果:
ListBucketResult(ListBucketResult=ListBucketResult.ListBucketResultContent(xmlns=http://s3.amazonaws.com/doc/2006-03-01/, name=null, prefix=null, marker=null, maxKeys=0, isTruncated=false, cOntents=null)) 使用 fastjson2 可以看到,只解析了 xmlns 这个字段的值; 我尝试在原始的 json 删掉这个 xmlns 字段,结果会是其他字段一样不能解析,list 也无法解析。
自己查阅了 fastjson 的文档 和 升级文档,没找到类似的说明
因此请教下社区的各位大神, 看这是什么情况? 谢谢
1 kokutou 2024 年 11 月 8 日 via Android 你就说快不快吧 |
2 V2Micheal 2024 年 11 月 9 日 |
3 OpenYanxi OP @V2Micheal ( 1 )@Data @NoArgsConstructor @AllArgsConstructor lombok 的注解会自动生成 setter 和 getter ( 2 )谢谢, 看来 fastjson 2 大小写敏感了,fastjson 1 是不敏感的 |
5 OpenYanxi OP @V2Micheal 感谢指点, 沿着你的思路: 找到这个: https://github.com/alibaba/fastjson/issues/1442 找到另外一个 fastjson 2 开启跟 fastjson 1 一样效果的一个参数: JSON.parseObject(rawJsonStr, ListBucketResult.class, SupportSmartMatch); 这样子就可以了 |