Skip to content

decoding exception if there is default value for field #177

@lonre

Description

@lonre

here is test code

package com.jsoniter;

import static java.util.Objects.isNull;

import com.jsoniter.spi.DecodingMode;
import com.jsoniter.spi.JsonException;
import com.jsoniter.spi.JsoniterSpi;
import java.util.Date;
import junit.framework.TestCase;

public class TestSpiTypeDecoder extends TestCase {

  static {
    JsoniterSpi.registerTypeEncoder(Date.class, ((obj, stream) -> {
      try {
        stream.writeVal(((Date) obj).getTime());
      } catch (Exception e) {
        throw new RuntimeException(e);
      }
    }));

    JsoniterSpi.registerTypeDecoder(Date.class, (iter) -> {
      try {
        Object value = iter.read();
        if (isNull(value)) {
          return null;
        } else if (value instanceof Number) {
          return new Date(((Number) value).longValue());
        } else {
          throw new RuntimeException("decode error");
        }
      } catch (JsonException e) {
        throw new RuntimeException(e);
      }
    });

    JsonIterator.setMode(DecodingMode.REFLECTION_MODE);
  }

  public static class Foo {
    private Date createdAt = new Date();

    public Date getCreatedAt() {
      return createdAt;
    }

    @Override
    public String toString() {
      return "Foo{" +
          "createdAt=" + createdAt +
          '}';
    }
  }

  public void test_foo() {
    System.out.println(JsonIterator.deserialize("{\"createdAt\":1196676930321}", Foo.class));
    System.out.println(JsonIterator.deserialize("{\"createdAt\":1196676930321}", Foo.class));
  }
}

exception:

Foo{createdAt=Mon Dec 03 18:15:30 CST 2007}

java.lang.IllegalArgumentException: Can not set java.util.Date field com.jsoniter.TestSpiTypeDecoder$Foo.createdAt to java.util.Date

	at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:167)
	at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:171)
	at sun.reflect.UnsafeFieldAccessorImpl.ensureObj(UnsafeFieldAccessorImpl.java:58)
	at sun.reflect.UnsafeObjectFieldAccessorImpl.get(UnsafeObjectFieldAccessorImpl.java:36)
	at java.lang.reflect.Field.get(Field.java:393)
	at com.jsoniter.ReflectionObjectDecoder.decodeBinding(ReflectionObjectDecoder.java:382)
	at com.jsoniter.ReflectionObjectDecoder.access$700(ReflectionObjectDecoder.java:10)
	at com.jsoniter.ReflectionObjectDecoder$OnlyField.decode_(ReflectionObjectDecoder.java:153)
	at com.jsoniter.ReflectionObjectDecoder$OnlyField.decode(ReflectionObjectDecoder.java:119)
	at com.jsoniter.JsonIterator.read(JsonIterator.java:385)
	at com.jsoniter.JsonIterator.read(JsonIterator.java:375)
	at com.jsoniter.JsonIterator.deserialize(JsonIterator.java:441)
	at com.jsoniter.JsonIterator.deserialize(JsonIterator.java:411)
	at com.jsoniter.TestSpiTypeDecoder.test_foo(TestSpiTypeDecoder.java:57)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at junit.framework.TestCase.runTest(TestCase.java:176)
	at junit.framework.TestCase.runBare(TestCase.java:141)
	at junit.framework.TestResult$1.protect(TestResult.java:122)
	at junit.framework.TestResult.runProtected(TestResult.java:142)
	at junit.framework.TestResult.run(TestResult.java:125)
	at junit.framework.TestCase.run(TestCase.java:129)
	at junit.framework.TestSuite.runTest(TestSuite.java:252)
	at junit.framework.TestSuite.run(TestSuite.java:247)
	at org.junit.internal.runners.JUnit38ClassRunner.run(JUnit38ClassRunner.java:86)
	at org.junit.runner.JUnitCore.run(JUnitCore.java:137)

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions