[alibaba/fastjson]1.2.83版本时间转换成1970-01-01 (1.2.62正常)

2024-09-02 684 views
4

public static void main(String[] args) {

JSONObject jsonObject = new JSONObject();
jsonObject.put("kprq","20220502");

//转成 - - 形式
JSONObject targetObject = new JSONObject();
targetObject.put("billDate", jsonObject.get("kprq"));
System.out.println(jsonObject.get("kprq"));
System.out.println(JSON.toJSONString(targetObject));
System.out.println(JSON.toJSONString(targetObject.toJavaObject(TTTT.class)));

}

@Getter @Setter @NoArgsConstructor public class TTTT {

@JSONField(format = "yyyy-MM-dd") private Date billDate;

}

回答

9

经过测试将输入日期字符串改成2022-05-02 输出测试正常,这是测试代码。 @Test(timeout = 4000) public void testToJSONStringToJavaObject() throws Throwable { JSONObject jsonObject = new JSONObject(); jsonObject.put("kprq","2022-05-02"); JSONObject targetObject = new JSONObject(); targetObject.put("billDate", jsonObject.get("kprq")); assertEquals(JSON.toJSONString(targetObject.toJavaObject(TTTT.class)),"{\"billDate\":\"2022-05-02\"}"); }

8

@Test public void testToJSONStringToJavaObject() throws Throwable { JSONObject jsonObject = new JSONObject(); jsonObject.put("kprq","20220502"); JSONObject targetObject = new JSONObject(); targetObject.put("billDate", jsonObject.get("kprq")); Assertions.assertEquals(JSON.toJSONString(targetObject.toJavaObject(TTTT.class)),"{\"billDate\":\"20220502\"}"); }

@Getter @Setter @NoArgsConstructor class TTTT {

@JSONField(format = "yyyyMMdd") private Date billDate;

}

这个转换有问题。 Expected :{"billDate":"19700101"} Actual :{"billDate":"20220502"}

8

fastjson 1.2.41 升级1.2.83 问题: 用例: `

@Data public static class MyObject{

private Date beginDate;

}

JSONObject jsonObject = new JSONObject(); jsonObject.put("beginDate","20201130114323284"); MyObject myObject = JSON.toJavaObject(jsonObject,MyObject.class); System.out.println(myObject); `

1.2.83 不正常 beginDate=Sun May 01 15:45:23 CST 642118 1.2.41 正常 beginDate=Mon Nov 30 11:43:23 CST 2020

1

@lhwzds 确认一下下面代码:

          String input;
          if (value instanceof String
              && JSONValidator.from(((String) value))
              .validate())
          {
            input = "\"" +  value + "\""; //这是我修复临时改的代码
          } else {
            input = JSON.toJSONString(value);
          }

          DefaultJSONParser parser = new DefaultJSONParser(input);
          fieldDeser.parseField(parser, object, paramType, null);
          continue;

应该是最近版本优化了性能,原来是无论是不是String,都会toJsonString,当是String的时候,会多拼一个引号,后面解析的时候会认为是字符串,走日期格式解析,如果没有引号,认为是int类型,就不会走解析了,这个问题以前是没有的,80以后的版本才有,应该是bug

5

@gtxhdn 原来是这个原因,理解了

8

这个bug不修复了吗,就这样一直存在?

5

这个版本没有发布呢,仓库里下载不下来

1

23年了还没修复吗