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 的文档 和 升级文档,没找到类似的说明

因此请教下社区的各位大神, 看这是什么情况? 谢谢

举报· 24 次点击
登录 注册 站外分享
1 条回复  
kokutou 小成 2024-11-8 15:50:16
你就说快不快吧
返回顶部