Avalara: Что такое допустимый формат DateTime для даты json? - PullRequest
1 голос
/ 01 октября 2019

Какой правильный формат даты JSON для Avalara? Следующий код:

 TransactionModel transaction = new TransactionBuilder(client, "COMPANY", DocumentType.SalesOrder, "myCompany.")
    .withDate(Calendar.getInstance().getTime())
    .withAddress(TransactionAddressType.SingleLocation, null, null, null, null, null, zipCode, "US")
    .withLine( new BigDecimal(100.0), new BigDecimal(1), "P0000000")
    .Create();

выдает исключение, которое не указывает на правильный формат:

com.google.gson.JsonSyntaxException: 2019-10-01
    at com.google.gson.DefaultDateTypeAdapter.deserializeToDate(DefaultDateTypeAdapter.java:107)
    at com.google.gson.DefaultDateTypeAdapter.deserialize(DefaultDateTypeAdapter.java:82)
    at com.google.gson.DefaultDateTypeAdapter.deserialize(DefaultDateTypeAdapter.java:35)
    at com.google.gson.TreeTypeAdapter.read(TreeTypeAdapter.java:58)
    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.read(ReflectiveTypeAdapterFactory.java:93)
    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:172)
    at com.google.gson.Gson.fromJson(Gson.java:803)
    at com.google.gson.Gson.fromJson(Gson.java:768)
    at com.google.gson.Gson.fromJson(Gson.java:717)
    at net.avalara.avatax.rest.client.serializer.JsonSerializer.DeserializeObject(JsonSerializer.java:15)
    at net.avalara.avatax.rest.client.RestCall.call(RestCall.java:99)
    at net.avalara.avatax.rest.client.AvaTaxClient.createTransaction(AvaTaxClient.java:19174)
    at net.avalara.avatax.rest.client.TransactionBuilder.Create(TransactionBuilder.java:425)

1 Ответ

1 голос
/ 01 октября 2019

Если сомневаетесь, читайте источник. Похоже, что com.google.gson.DefaultDateTypeAdapter имеет пару форматов даты по умолчанию, которые он попытается использовать в deserializeToDate. Поэтому убедитесь, что вы используете один из них.

Большинство форматов дат поступают из java.text.DateFormat

Также проверьте источник AvaTax-REST-V2

Если у вас есть источник, связанный в вашем редакторе, то я рекомендую установить точку останова в нескольких местах трассировки стека, чтобы увидеть, что происходит. Один хороший кандидат будет, конечно, в deserializeToDate.


DefaultDateTypeAdapter.java

/**
 * List of 1 or more different date formats used for de-serialization attempts. The first of them is
 * used for serialization as well.
 */
private final List<DateFormat> dateFormats = new ArrayList<DateFormat>();

DefaultDateTypeAdapter(Class<? extends Date> dateType) {
    this.dateType = verifyDateType(dateType);
    dateFormats.add(DateFormat.getDateTimeInstance(DateFormat.DEFAULT, DateFormat.DEFAULT, Locale.US));
    if (!Locale.getDefault().equals(Locale.US)) {
        dateFormats.add(DateFormat.getDateTimeInstance(DateFormat.DEFAULT, DateFormat.DEFAULT));
    }
    if (JavaVersion.isJava9OrLater()) {
        dateFormats.add(PreJava9DateFormatProvider.getUSDateTimeFormat(DateFormat.DEFAULT, DateFormat.DEFAULT));
    }
}

DefaultDateTypeAdapter(Class<? extends Date> dateType, String datePattern) {
    this.dateType = verifyDateType(dateType);
    dateFormats.add(new SimpleDateFormat(datePattern, Locale.US));
    if (!Locale.getDefault().equals(Locale.US)) {
        dateFormats.add(new SimpleDateFormat(datePattern));
    }
}

DefaultDateTypeAdapter(Class<? extends Date> dateType, int style) {
    this.dateType = verifyDateType(dateType);
    dateFormats.add(DateFormat.getDateInstance(style, Locale.US));
    if (!Locale.getDefault().equals(Locale.US)) {
        dateFormats.add(DateFormat.getDateInstance(style));
    }
    if (JavaVersion.isJava9OrLater()) {
        dateFormats.add(PreJava9DateFormatProvider.getUSDateFormat(style));
    }
}

public DefaultDateTypeAdapter(int dateStyle, int timeStyle) {
    this(Date.class, dateStyle, timeStyle);
}

public DefaultDateTypeAdapter(Class<? extends Date> dateType, int dateStyle, int timeStyle) {
    this.dateType = verifyDateType(dateType);
    dateFormats.add(DateFormat.getDateTimeInstance(dateStyle, timeStyle, Locale.US));
    if (!Locale.getDefault().equals(Locale.US)) {
        dateFormats.add(DateFormat.getDateTimeInstance(dateStyle, timeStyle));
    }
    if (JavaVersion.isJava9OrLater()) {
        dateFormats.add(PreJava9DateFormatProvider.getUSDateTimeFormat(dateStyle, timeStyle));
    }
}
...