Преобразование JSON в Java / Scala с использованием GSON (или любой другой библиотеки) -> Структура бина неясна - PullRequest
1 голос
/ 30 марта 2012

У меня есть эта строка JSON:

    {
  "totalSize" : 2,
  "done" : true,
  "records" : [ {
    "attributes" : {
      "type" : "Article__c",
      "url" : "/services/data/v20.0/sobjects/Article__c/a01d00000030gSxAAI"
    },
    "Name" : "ABC - Fri Mar 30 01:54:57 CEST 2012"
  }, {
    "attributes" : {
      "type" : "Article__c",
      "url" : "/services/data/v20.0/sobjects/Article__c/a01d00000030gSaAAI"
    },
    "Name" : "XYZ - Fri Mar 30 01:52:25 CEST 2012"
  } ]
}

Мне нужен объект Java для получения значений ключей. Я пытался использовать Gson (но другое простое решение также будет в порядке). Я думал, что структура бобов должна быть такой:

case class AttributeBean(typ: String, url: String)
case class RecordBean(attributes: List[AttributeBean], name: String)
case class ResponseBean(totalSize: Int, done: Boolean, records: List[RecordBean])

К сожалению, это не работает. Я делаю следующий вызов Gson:

val response : ResponseBean = gson.fromJson(responseAsString, classOf[ResponseBean])

Нет никаких исключений, но я получаю это НЕПРАВИЛЬНОЕ содержимое bean-компонента:

ResponseBean(0,false,null)

Это должно быть 2, правда, "список с записями". Может кто-нибудь сказать мне правильную структуру bean-компонентов для анализа строки JSON?

Заранее спасибо ...

С наилучшими пожеланиями, Кай

Ответы [ 3 ]

3 голосов
/ 01 апреля 2012

Gson изначально не работает со "классами дел" Scala. Двумя лучшими вариантами использования Json с «классами дел» являются Jerkson и lift-json . После работы с обоими, я бы порекомендовал Jerkson за его скорость и поддержку потокового чтения и записи, но обе библиотеки должны удовлетворять вашему варианту использования.

3 голосов
/ 30 марта 2012

Я не совсем понимаю обозначения, которые вы используете. Однако я вижу там несколько ошибок:

  • Атрибуты - это не список, это просто объект, или, по крайней мере, так говорит ваш json
  • AttributeBean поле должно быть type, а не typ
  • Name атрибут должен быть в верхнем регистре в определении класса (если я посмотрю на json)

В противном случае ваши ожидания от GSON кажутся хорошими, и код тоже. GSON прост в использовании, и я серьезно рекомендую его. Единственные другие проблемы, которые могут возникнуть в вашем коде, связаны со скалами, потому что я не понимаю язык.

РЕДАКТИРОВАТЬ Добавление примера Java о том, как получить поле класса, не соответствующее полю json:

{
   "type" : "Article__c",
   "url" : "/services/data/v20.0/sobjects/Article__c/a01d00000030gSxAAI"
}

И код Java:

public class AttributeBean {
    public String url;
    @SerializedName("type")
    public String typ;
}

Из-за этой аннотации синтаксический анализ пройдет нормально.

0 голосов
/ 30 сентября 2014

Вы можете назвать свое поле `type` (в обратном порядке), что может помочь решить проблему имен полей, уже занятых ключевыми словами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...