当以Json格式返回时,avro运行时异常不是映射

时间:2015-04-24 21:58:32

标签: json avro

我有一个UKRecord的avro架构,其中包含一个CMRecord列表(也是avro架构的):

{
    "namespace": "com.uhdyi.hi.avro",
    "type": "record",
    "name": "UKRecord",
    "fields": [
        {
            "name": "coupon",
            "type": [
                "null",
                "string"
            ],
            "default": null
        },
        {
            "name": "cm",
            "type": [
                "null",
                {
                    "type": "array",
                    "items": {
                        "type": "record",
                        "name": "CmRecord",
                        "fields": [
                            {
                                "name": "id",
                                "type": "string",
                                "default": ""
                            },
                            {
                                "name": "name",
                                "type": "string",
                                "default": ""
                            }
                        ]
                    }
                }
            ],
            "default": null
        }
    ]
}

在我的java代码中,我创建了一个UKRecord,其中所有字段都填充正确,最终我需要使用基于json的api返回此对象,但它抱怨:

org.apache.avro.AvroRuntimeException: Not a map: {"type":"record","name":"CmRecord","namespace":"com.uhdyi.hi.avro","fields":[{"name":"id","type":"string","default":""},{"name":"name","type":"string","default":""}]}

将对象写入json的java代码是:

ObjectWriter writer = ObjectMapper.writer();
if (obj != null) {
   response.setHeader(HttpHeaders.Names.CONTENT_TYPE, "application/json; charset=UTF-8");
   byte[] bytes = writer.writeValueAsBytes(obj);  <-- failed here
        ...
}

obj是:

{"coupon": "c12345", "cm": [{"id": "1", "name": "name1"}, {"id": "2", "name": "name2"}]}

为什么我会收到此错误?请帮忙!

1 个答案:

答案 0 :(得分:0)

因为您正在使用工会,Avro不确定如何解释您提供的JSON。以下是如何更改JSON,以便Avro知道它不为空

{
  "coupon": { "string": "c12345" },
  "cm": { "array": [
          { "id": "1", "name": "name1" },
          { "id": "2", "name": "name2" }
        ]
  }
}

我知道,Avro如何选择处理空值真的很烦人。