Announcement Announcement Module
Collapse
No announcement yet.
Problems with RestTemplate and deserializing a JSON array Page Title Module
Move Remove Collapse
X
Conversation Detail Module
Collapse
  • Filter
  • Time
  • Show
Clear All
new posts

  • Problems with RestTemplate and deserializing a JSON array

    Hi all,

    I'm using RestTemplate to consume the Chargify RESTful API. So far, it has been going very smoothly. However, I'm having no luck getting a JSON array deserialized into a Java array. Consider this code:

    Code:
    Transaction[] transactions = restTemplate.getForObject(
    		CHARGIFY_ENDPOINT + "/subscriptions/{subscription}/transactions.json",
    		Transaction[].class,
    		subscription.getChargifyReference()
    	);
    My RestTemplate uses a custom ObjectMapper, where I set the following options:

    Code:
    configure(SerializationConfig.Feature.WRAP_ROOT_VALUE, true);
    configure(DeserializationConfig.Feature.UNWRAP_ROOT_VALUE, true);
    The GET request goes through great. Here is the JSON response from Chargify:

    Code:
    [ { "transaction" : { "amount_in_cents" : 3006,
            "created_at" : "2012-06-17T16:32:05-04:00",
            "ending_balance_in_cents" : 0,
            "id" : 17283728,
            "kind" : null,
            "memo" : "",
            "payment_id" : null,
            "product_id" : 120387,
            "subscription_id" : 1947292,
            "success" : true,
            "transaction_type" : "payment",
            "type" : "Payment"
          } },
      { "transaction" : { "amount_in_cents" : 5900,
            "created_at" : "2012-06-17T16:32:05-04:00",
            "ending_balance_in_cents" : 3006,
            "id" : 17283727,
            "kind" : "baseline",
            "memo" : "Professional Plan (06/17/2012 - 07/17/2012)",
            "payment_id" : 17283728,
            "product_id" : 120387,
            "subscription_id" : 1947292,
            "success" : true,
            "transaction_type" : "charge",
            "type" : "Charge"
          } },
      { "transaction" : { "amount_in_cents" : -2894,
            "created_at" : "2012-06-17T16:32:03-04:00",
            "ending_balance_in_cents" : -2894,
            "id" : 17283726,
            "kind" : "prorated",
            "memo" : "",
            "payment_id" : null,
            "product_id" : 120387,
            "subscription_id" : 1947292,
            "success" : null,
            "transaction_type" : "adjustment",
            "type" : "Adjustment"
          } },
      { "transaction" : { "amount_in_cents" : 2900,
            "created_at" : "2012-06-17T15:17:07-04:00",
            "ending_balance_in_cents" : 0,
            "id" : 17281084,
            "kind" : null,
            "memo" : "",
            "payment_id" : null,
            "product_id" : 120386,
            "subscription_id" : 1947292,
            "success" : true,
            "transaction_type" : "payment",
            "type" : "Payment"
          } },
      { "transaction" : { "amount_in_cents" : 2900,
            "created_at" : "2012-06-17T15:17:06-04:00",
            "ending_balance_in_cents" : 2900,
            "id" : 17281083,
            "kind" : "baseline",
            "memo" : "Standard Plan (06/17/2012 - 07/17/2012)",
            "payment_id" : 17281084,
            "product_id" : 120386,
            "subscription_id" : 1947292,
            "success" : true,
            "transaction_type" : "charge",
            "type" : "Charge"
          } }
    ]
    The problem is during deserialization I get: org.codehaus.jackson.map.JsonMappingException: Current token not START_OBJECT (needed to unwrap root name 'Transaction[]'), but START_ARRAY

    Code:
    16:59:12.651 [http-8080-1] DEBUG org.springframework.web.client.RestTemplate - GET request for "https://foobar.chargify.com/subscriptions/1947292/transactions.json" resulted in 200 (OK)
    16:59:12.651 [http-8080-1] DEBUG org.springframework.web.client.RestTemplate - Reading [[Lcom.foobar.chargify.Transaction;] as "application/json;charset=utf-8" using [org.springframework.http.converter.json.MappingJacksonHttpMessageConverter@1ea8dbd]
    16:59:12.662 [http-8080-1] DEBUG org.apache.http.wire - << "[{"transaction":{"type":"Payment","amount_in_cents":3006,"payment_id":null,"memo":"","id":17283728,"created_at":"2012-06-17T16:32:05-04:00","subscription_id":1947292,"kind":null,"ending_balance_in_cents":0,"success":true,"product_id":120387,"transaction_type":"payment"}},{"transaction":{"type":"Charge","amount_in_cents":5900,"payment_id":17283728,"memo":"Professional Plan (06/17/2012 - 07/17/2012)","id":17283727,"created_at":"2012-06-17T16:32:05-04:00","subscription_id":1947292,"kind":"baseline","ending_balance_in_cents":3006,"success":true,"product_id":120387,"transaction_type":"charge"}},{"transaction":{"type":"Adjustment","amount_in_cents":-2894,"payment_id":null,"memo":"","id":17283726,"created_at":"2012-06-17T16:32:03-04:00","subscription_id":1947292,"kind":"prorated","ending_balance_in_cents":-2894,"success":null,"product_id":120387,"transaction_type":"adjustment"}},{"transaction":{"type":"Payment","amount_in_cents":2900,"payment_id":null,"memo":"","id":17281084,"created_at":"2012-06-17T15:17:07-04:00","subscription_id":1947292,"kind":null,"ending_balance_in_cents":0,"success":true,"product_id":120386,"transaction_type":"payment"}},{"transaction":{"type":"Charge","amount_in_cents":2900,"payment_id":17281084,"memo":"Standard Plan (06/17/2012 - 07/17/2012)","id":17281083,"created_at":"2012-06-17T15:17:06-04:00","subscription_id":1947292,"kind":"baseline","ending_balance_in_cents":2900,"success":true,"product_id":120386,"transaction_type":"charge"}}]"
    16:59:12.683 [http-8080-1] DEBUG org.apache.http.impl.conn.SingleClientConnManager - Releasing connection org.apache.http.impl.conn.SingleClientConnManager$ConnAdapter@17ed710
    16:59:12.684 [http-8080-1] DEBUG org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver - Resolving exception from handler [public void com.foobar.controllers.TestController.viewTransactions(int)]: org.springframework.http.converter.HttpMessageNotReadableException: Could not read JSON: Current token not START_OBJECT (needed to unwrap root name 'Transaction[]'), but START_ARRAY
     at [Source: org.apache.http.conn.EofSensorInputStream@598a5d; line: 1, column: 1]; nested exception is org.codehaus.jackson.map.JsonMappingException: Current token not START_OBJECT (needed to unwrap root name 'Transaction[]'), but START_ARRAY
     at [Source: org.apache.http.conn.EofSensorInputStream@598a5d; line: 1, column: 1]
    16:59:12.686 [http-8080-1] DEBUG org.springframework.web.servlet.mvc.annotation.ResponseStatusExceptionResolver - Resolving exception from handler [public void com.foobar.controllers.TestController.viewTransactions(int)]: org.springframework.http.converter.HttpMessageNotReadableException: Could not read JSON: Current token not START_OBJECT (needed to unwrap root name 'Transaction[]'), but START_ARRAY
     at [Source: org.apache.http.conn.EofSensorInputStream@598a5d; line: 1, column: 1]; nested exception is org.codehaus.jackson.map.JsonMappingException: Current token not START_OBJECT (needed to unwrap root name 'Transaction[]'), but START_ARRAY
     at [Source: org.apache.http.conn.EofSensorInputStream@598a5d; line: 1, column: 1]
    16:59:12.686 [http-8080-1] DEBUG org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver - Resolving exception from handler [public void com.foobar.controllers.TestController.viewTransactions(int)]: org.springframework.http.converter.HttpMessageNotReadableException: Could not read JSON: Current token not START_OBJECT (needed to unwrap root name 'Transaction[]'), but START_ARRAY
     at [Source: org.apache.http.conn.EofSensorInputStream@598a5d; line: 1, column: 1]; nested exception is org.codehaus.jackson.map.JsonMappingException: Current token not START_OBJECT (needed to unwrap root name 'Transaction[]'), but START_ARRAY
     at [Source: org.apache.http.conn.EofSensorInputStream@598a5d; line: 1, column: 1]
    I've researched this for a couple days now, I'm not having any luck finding answers. It's almost like Jackson is trying to read the JSON array as a Java object.

    Deserialization of a single Transaction object works fine. It's only when trying to deserialize an array of them where I have a problem.

    Any help, pointers, links, advice whatsoever would be incredibly appreciated. I'm close to tearing my hair out on this one!
    Last edited by damrass; Jun 18th, 2012, 01:40 AM.
Working...
X