2015-08-09 4 views
0

Я новичок в Java. Я использую Spring для использования REST api, который выводит JSON. С помощью учебных пособий на веб-сайте Spring я могу легко получить ответ JSON, преобразованный в объект моего желаемого класса. Проблема в том, что один из ключей в ответе JSON - $id. Я не могу сделать переменную со знаком доллара. Я предполагаю, что я должен где-то определить какую-то конфигурацию, чтобы такое имя было преобразовано во что-то приемлемое. Я не знаю, как это сделать.

My Rest Код запроса:

protected LoginResult doInBackground(Void... params) { 
    try { 
     Log.i(TAG, "Making Login request"); 
     //TODO: Make this a setting 
     final String url = "https://someurl.com/api/login"; 

     LoginCredentials login = new LoginCredentials("[email protected]", "qwerty123"); 

     RestTemplate restTemplate = new RestTemplate(); 
     restTemplate.getMessageConverters().add(new MappingJackson2HttpMessageConverter()); 

     LoginResult result = restTemplate.postForObject(url, login, LoginResult.class); 

     Log.d(TAG, "Got the LoginResult."); 
     return result; 
    } catch (Exception e) { 
     //TODO: Exception handling 
     Log.e(TAG, e.getMessage(), e); 
    } 

    return null; 
} 

В результате JSON выглядит примерно так:

{ 
    "_id":{ 
     "$id":"98765432" 
    }, 
    "name":"Person Guy", 
    "email":"[email protected]", 
    "roles":[ 
     "user" 
    ], 
    "active":true, 
    "created":{ 
     "sec":1439117849, 
     "usec":856000 
    }, 
    "session":{ 
     "token":"12345678", 
     "user_id":"98765432", 
     "created":{ 
     "sec":1439134272, 
     "usec":0 
     }, 
     "last_extended":{ 
     "sec":1439134272, 
     "usec":0 
     }, 
     "expires":{ 
     "sec":1439998272, 
     "usec":0 
     } 
    } 
} 

$id часть, где все становится сложнее. Класс LoginResult выглядит следующим образом:

@JsonIgnoreProperties(ignoreUnknown = true) 
public class LoginResult { 
    private String name; 
    private String email; 
    private MongoId _id; 
    /* Getters and setters */ 
} 

Класс Mongoid выглядит следующим образом (JsonIgnoreProperties теперь добавляется, чтобы избежать исключения):

@JsonIgnoreProperties(ignoreUnknown = true) 
public class MongoId { 
    private String id; //This is $id in the JSON response. 

    public String getId() { 
     return id; 
    } 

    public void setId(String id) { 
     this.id = id; 
    } 
} 

Любая помощь будет в значительной степени оценены.

+0

Я подозрительно, если $ является проблемой. – Garry

+0

@Garry, используя переменные $ в переменных в Android Studio, дает мне всевозможные ошибки. Также кажется, что Java препятствует использованию $ -signs в переменных в своей документации. – Coo

ответ

2

Вы можете использовать @JsonProperty("$id") аннотацию в MongoId сказать, как JSON отображается на ваш объект Java:

@JsonIgnoreProperties(ignoreUnknown = true) 
public class MongoId { 
    @JsonProperty("$id") 
    private String id; //This is $id in the JSON response. 

    public String getId() { 
     return id; 
    } 

    public void setId(String id) { 
     this.id = id; 
    } 
} 

Вот quick overview для справки.

+0

Это прекрасно работает. Бонусный вопрос: могу ли я настроить таргетинг на более глубокий уровень с этим? например '@JsonProperty (« session/token »)'? – Coo

+0

Я не уверен, возможно ли это с помощью простой аннотации. Вам, вероятно, придется использовать собственный десериализатор. Например, см. Http://www.baeldung.com/jackson-deserialization – beosign

Смежные вопросы