当前位置: 首页 > 知识库问答 >
问题:

将对象转换为JSON字符串-org时发生JsonMappingException。阿帕奇。阿夫罗。AvroRuntimeException:不是数组:

戎洛城
2023-03-14

在将Java对象转换为JSON字符串时,我遇到了JsonMappingException。下面是完整的异常消息。

com.fasterxml.jackson.databind.JsonMappingException: Not an array: {"type":"record","name":"ClearingSystemMemberIdentification2","namespace":"com.sam.eps.paymentdomain.avro.pacs002","doc":"Schema for com.sam.eps.iso.pacs002.ClearingSystemMemberIdentification2","fields":[{"name":"clearing_system_identification","type":["null",{"type":"record","name":"ClearingSystemIdentification2Choice","doc":"Schema for com.sam.eps.iso.pacs002.ClearingSystemIdentification2Choice","fields":[{"name":"code","type":["null",{"type":"string","avro.java.string":"String"}],"default":null},{"name":"proprietary","type":["null",{"type":"string","avro.java.string":"String"}],"default":null}]}],"default":null},{"name":"member_identification","type":["null",{"type":"string","avro.java.string":"String"}],"default":null}]} (through reference chain: com.sam.eps.paymentdomain.avro.pacs002.Document["fi_to_fi_payment_status_report"]->com.sam.eps.paymentdomain.avro.pacs002.FIToFIPaymentStatusReportV10["group_header"]->com.sam.eps.paymentdomain.avro.pacs002.GroupHeader91["instructed_agent"]->com.sam.eps.paymentdomain.avro.pacs002.BranchAndFinancialInstitutionIdentification6["financial_institution_identification"]->com.sam.eps.paymentdomain.avro.pacs002.FinancialInstitutionIdentification18["clearing_system_member_identification"]->com.sam.eps.paymentdomain.avro.pacs002.ClearingSystemMemberIdentification2["schema"]->org.apache.avro.Schema$RecordSchema["elementType"])

下面是我用来将Java对象转换为JSON字符串的java代码。我尝试启用ACCEPT_SINGLE_VALUE_AS_ARRAY,ACCEPT_EMPTY_ARRAY_AS_NULL_OBJECT但仍然面临问题。不确定是什么导致了JsonMappingException:不是数组问题。

private String convertObjectToJson(Object request) throws JsonProcessingException {

        ObjectMapper objectMapper = new ObjectMapper();
        objectMapper.registerModule(new JavaTimeModule());
        SimpleModule simpleModule = new SimpleModule();
        simpleModule.addSerializer(OffsetDateTime.class, new JsonSerializer<OffsetDateTime>() {
            @Override
            public void serialize(OffsetDateTime offsetDateTime, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
                jsonGenerator.writeString(DateTimeFormatter.ISO_OFFSET_DATE_TIME.format(offsetDateTime));
            }
        });
        simpleModule.addSerializer(LocalDate.class, new JsonSerializer<LocalDate>() {
            @Override
            public void serialize(LocalDate localDate, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
                jsonGenerator.writeString(DateTimeFormatter.ISO_LOCAL_DATE.format(localDate));
            }
        });
        objectMapper.registerModule(simpleModule);
        objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
        objectMapper.enable(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY);
        objectMapper.enable(DeserializationFeature.ACCEPT_EMPTY_ARRAY_AS_NULL_OBJECT);
        objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
        return objectMapper.writeValueAsString(request);
    }

共有2个答案

闻人望
2023-03-14
匿名用户

Jackson转换过程递归地计算对象的每个字段或getter,因此可以创建JSON节点。

您可能在这里转换生成的AVRO类型。它包含一个名为$SCHEMA的字段,该字段本身没有实现名为getElementType()的方法。org的默认方法。阿帕奇。阿夫罗。模式明确抛出此异常。由于Jackson在转换过程中遇到此方法,因此引发了异常。

getElementType()只是该模式类中默认引发异常的许多默认实现之一。除了不使用Jackson创建JSON,而是使用最初创建AVRO类型的相同API之外,我认为没有任何方法可以解决这个问题。

编辑:也许你可以注册一个JsonSerializer

长孙弘壮
2023-03-14

当您使用Avro编译器从Avro模式自动生成POJO时,就会出现这个问题。此自动生成的POJO包含以下额外字段(除用户在Avro模式中指定的字段外)

public static final org.apache.avro.Schema SCHEMA$;

由于Avro API中的一些错误,模式。方法在序列化期间不会导致数组异常。下面是方法定义

 public Schema getElementType() {
    throw new AvroRuntimeException("Not an array: " + this);
  }

要解决此问题,只需在序列化期间忽略自动生成的POJO中的ScheMA$字段,如下所示

// create this class to ignore one or more fields
public abstract class IgnoreSchemaProperty
{
    @JsonIgnore
    abstract void getSchema();
}

public class Test{
    public static void main(String args[]) {
        ObjectMapper objectMapper=new ObjectMapper();
        //pass the above created class in the mixIn
        objectMapper.addMixIn(YourPojo.class, IgnoreSchemaProperty.class);
        String pojoJson = objectMapper.writeValueAsString(YourPojo);
        System.out.println(pojoJson);
    }
}

 类似资料:
  • Apache Kafka:分布式消息传递系统 Apache Storm:实时消息处理 我们如何在实时数据管道中使用这两种技术来处理事件数据? 在实时数据管道方面,我觉得两者做的工作是一样的。如何在数据管道上同时使用这两种技术?

  • 问题内容: 将字符串表示形式转换为对象,但我要相反。对象要转换为JSON字符串,我有一个链接http://www.devcurry.com/2010/03/convert- javascript-object-to-json.html, 但是它需要json2.js jQuery是否具有本机功能方法来做到这一点? 问题答案: jQuery只会在调用本机浏览器方法之前进行一些正则表达式检查。如果不可用

  • 问题内容: 如何使用JavaScript(或jQuery)将描述对象的字符串转换为JSON字符串? 例如:转换这个( 不是 有效的JSON字符串): 到这个: 如果可能,我希望避免使用。 问题答案: 如果字符串是来自可靠来源 ,你可以使用然后的结果。像这样: 请注意,当您使用对象文字时,必须将其括在圆括号中,否则将花括号解析为块而不是对象。 我也同意以下问题的评论,那就是最好以有效的JSON开始编

  • 问题内容: 您如何使JS认为字符串是JSON? 我有一个仅在将JSON对象传递给它的情况下才起作用的函数。如果我以与JSON相同的格式将字符串传递给它,则它将不起作用。因此,我想让该函数认为传递给它的字符串是JSON。该字符串确实采用JSON格式。 我还尝试了以下方法。我通过Ajax输入了字符串,参数“ handle as”为“ JSON”,然后将结果传递给函数。 所以我推断出问题不在弦上。如何将

  • 您能说Apache Karaf包括以下内容吗?其中包括: Apache Felix(它是OSGi 4.2框架的实现) Apache Aries(它是Blueprint标准的实现)

  • 在我部署在WebSphere 8.5上的java应用程序中,我遇到了这个错误,尽管我的maven依赖项低于log4j。 我确实运行了一个,我可以看到它正以 的形式被拉进来,这是我期望在树结果中看到的,这样我就可以确认它在类路径中。有什么想法吗?