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

Conversion to java Object fails when using jsonObject.toJavaObject() due to DateTimeParseException #1621

Closed
hshar89 opened this issue Jul 8, 2023 · 1 comment
Labels
bug Something isn't working fixed
Milestone

Comments

@hshar89
Copy link

hshar89 commented Jul 8, 2023

Class code -

public class Demo {
    public static void main(String[] args) {
        final OffsetDateTime defaultDateTime = OffsetDateTime.MIN;
        DemoMetadata demoMetadata = DemoMetadata.builder()
                .metadataType("TestType")
                .lastMetadataRefreshTime(defaultDateTime)
                .build();
        Map<String, DemoMetadata> map = new HashMap<>();
        map.put(demoMetadata.getMetadataType(), demoMetadata);
        DemoRoot demoRoot = DemoRoot.builder()
                .rootName("Root")
                .lastMetadataRefreshTime(defaultDateTime)
                .dmoToDaoTypeMapping(map)
                .build();
        JSONObject jsonObject = (JSONObject) JSON.toJSON(demoRoot);
        System.out.println(jsonObject);
        DemoRoot updatedRoot = jsonObject.toJavaObject(DemoRoot.class);
        System.out.println(updatedRoot);
    }
    }
    
    @Data
@SuperBuilder
@EqualsAndHashCode(callSuper = true)
@NoArgsConstructor
@AllArgsConstructor
@ToString
public class DemoRoot extends DemoAbstract{

    private static final long serialVersionUID = 1L;
    private String rootName;
    private Map<String, DemoMetadata> dmoToDaoTypeMapping;
    @Override
    public void someFunction() {

    }
}

@Data
@SuperBuilder
@Generated
@EqualsAndHashCode(callSuper = true)
@NoArgsConstructor
@ToString
public class DemoMetadata extends DemoAbstract{

    private static final long serialVersionUID = 1L;

    private String metadataType;

    @Override
    public void someFunction() {

    }
}

@SuperBuilder
@Data
@NoArgsConstructor
@AllArgsConstructor
@ToString
public abstract class DemoAbstract implements Serializable {
    private static final long serialVersionUID = 1L;

    @EqualsAndHashCode.Exclude private OffsetDateTime lastMetadataRefreshTime;

    public abstract void someFunction();
}

Exception -
Exception in thread "main" java.time.format.DateTimeParseException: Text '-999999999-01-01T00:00:00' could not be parsed at index 25
at java.base/java.time.format.DateTimeFormatter.parseResolved0(DateTimeFormatter.java:2046)
at java.base/java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1948)
at java.base/java.time.ZonedDateTime.parse(ZonedDateTime.java:598)
at java.base/java.time.ZonedDateTime.parse(ZonedDateTime.java:583)
at com.alibaba.fastjson2.JSONReader.readZonedDateTime(JSONReader.java:1187)
at com.alibaba.fastjson2.JSONReaderUTF8.readOffsetDateTime(JSONReaderUTF8.java:5429)
at com.alibaba.fastjson2.reader.ORG_2_2_DemoMetadata.readObject(Unknown Source)
at com.alibaba.fastjson2.reader.ObjectReaderImplMapTyped.readObject(ObjectReaderImplMapTyped.java:373)
at com.alibaba.fastjson2.reader.FieldReader.acceptAny(FieldReader.java:437)
at com.alibaba.fastjson2.reader.ObjectReaderAdapter.createInstance(ObjectReaderAdapter.java:615)
at com.alibaba.fastjson2.JSONObject.to(JSONObject.java:1248)
at com.alibaba.fastjson2.JSONObject.toJavaObject(JSONObject.java:1258)
at daytodaycode.Demo.main(Demo.java:34)

##FastJson2 dependency

com.alibaba.fastjson2
fastjson2
2.0.34

Why does this happen?
DemoRoot updatedRoot = jsonObject.toJavaObject(DemoRoot.class);

The toJavaObject converts the private Map<String, DemoMetadata> dmoToDaoTypeMapping, to jsonString first and then converts it back to the exact class. This happens in the FieldReader class.
While doing JSON.toJsonString(), calls goes to JSONWriterUTF16.writeOffsetDateTime().

 if (utc) {
            chars[off++] = 'Z';
        } else {
            zoneId.getChars(0, zoneIdLength, chars, off);
        }

In the else block the off variable is not incremented. It should have been like this,

 if (utc) {
            chars[off++] = 'Z';
        } else {
            zoneId.getChars(0, zoneIdLength, chars, off);
            off = off+zoneIdLength
        }

This has been my analysis so far. In my local after doing the above change, the initial code works.

@hshar89 hshar89 added the bug Something isn't working label Jul 8, 2023
@wenshao wenshao added this to the 2.0.35 milestone Jul 8, 2023
@wenshao wenshao added the fixed label Jul 8, 2023
@wenshao
Copy link
Member

wenshao commented Jul 9, 2023

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

@wenshao wenshao closed this as completed Jul 9, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working fixed
Projects
None yet
Development

No branches or pull requests

2 participants