2013-04-15 3 views
1

У меня проблема для назначения данных JSON в Java class.Please сделать помочь любому, Мой класс Java, как,Json данных присвоить класс Java

public class ListofGridRecords<T> { 
    public int Totalrecords; 
    public List<T> GridRecords;//using TraderTransaction class. 
} 

и класс TraderTransaction есть

public class TraderTransaction { 

    public Date AddedTime; 
    public String TransactId; 
    public TransactStatus Status; 
    public String OtherPartyAccountNo; 
    public Double AmountPaid; 
    public Double AmountRecieved; 
    public Double ClosingBalance; 
    public TransactionTypes TransType; 
    public String Narration; 

    public TraderTransaction() { 
    super(); 
    } 
} 

и мое преобразование JSON функция выглядеть,

JsonObject returndata = JsonObject.parse(responseString); 
String operationresult = returndata.get("OperationResult").toString(); 

if (Result.values()[Integer.parseInt(operationresult)] == Result.Success) { 
    Gson gson = new Gson(); 

    @SuppressWarnings("unchecked") 
    ListofGridRecords<TraderTransaction> traderlist = 
     gson.fromJson(returndata.get("ResultData").toString(), ListofGridRecords.class); 

    Log.i("LIST DATA:", "" + traderlist); 
    for (TraderTransaction trader: traderlist.GridRecords) { 
    HashMap<String, String> map = new HashMap<String, String>(); 
    map.put(TRANS_FIRST_COLUMN, currentformatter.format(trader.AddedTime)); 
    map.put(TRANS_SECOND_COLUMN, trader.TransactId); 
    map.put(TRANS_THIRD_COLUMN, trader.OtherPartyAccountNo); 
    map.put(TRANS_FOURTH_COLUMN, trader.AmountPaid.toString()); 
    map.put(TRANS_FIFTH_COLUMN, trader.AmountRecieved.toString()); 
    map.put(TRANS_SIXTH_COLUMN, OpenOrClosed.values()[Integer.parseInt(trader.TransType.toString())].toString()); 
    list.add(map); 
    } 
} 

Я получаю сотрудничества nversion error for for (TraderTransaction trader: traderlist.GridRecords).

данные Мои JSon выглядеть,

{ 
    "Messages":"RESULTS_RETRIEVAL_SUCCESSFULL", 
    "OperationResult":0, 
    "ResultData":{ 
     "GridRecords":[ 
     { 
      "AddedBy":"Distributor-9787457361-Rathinavel", 
      "AddedTime":"2013-04-12T16:26:24.0140117", 
      "AmountPaid":0.0, 
      "AmountRecieved":10000.0, 
      "ClosingBalance":10000.0, 
      "Narration":null, 
      "OtherPartyAccountNo":"0102849015327675", 
      "Status":2, 
      "TransType":2, 
      "TransactId":"TDRF483679051236" 
     }, 
     { 
      "AddedBy":"Distributor-9787457361-Rathinavel", 
      "AddedTime":"2013-04-12T16:20:54.8681857", 
      "AmountPaid":0.0, 
      "AmountRecieved":0.0, 
      "ClosingBalance":0.0, 
      "Narration":null, 
      "OtherPartyAccountNo":"0102849015327675", 
      "Status":0, 
      "TransType":2, 
      "TransactId":"TDRF706925413802" 
     } 
     ], 
     "Totalrecords":2 
    }, 
    "UpdateAvailable":"0" 
} 
+0

Какая ошибка вы получаете? пожалуйста, укажите stacktrace. – MikO

+0

Я получаю ошибку, например, не могу преобразовать класс в для (TraderTransaction trader: traderlist.GridRecords) –

+0

Вы, вероятно, не должны использовать JSON для этого. В общем, он недостаточно мощный, чтобы представлять классы Java. У вас могут возникнуть проблемы, если у вас есть циклические ссылки (например, A включает объект B и наоборот). Мое предложение - переключиться на XML. XStream работал хорошо для меня; Кроме того, он возвращает более эффективные сообщения об ошибках, когда, например, с JSON. –

ответ

1

Для того, чтобы разобрать ваш JSON, я бы использовать немного другую стратегию. Как вы, кажется, заинтересованы в разборе только «ResultData», я бы создать классы оберткой ответ, очень похожи на те, которые вы уже создали, а именно:

public class Response { 
    @SerializedName("ResultData") 
    public ResultData resultData; 
} 

и

public class ResultData { 
    @SerializedName("GridRecords") 
    public List<GridRecord> gridRecords; 
    @SerializedName("Totalrecords") 
    public int totalrecords; 
} 

и

public class GridRecord { 
    @SerializedName("AddedTime") 
    public String addedTime; 
    @SerializedName("TransactId") 
    public String transactId; 
    //other fields... 
} 

и при необходимости другие классы ...

Тогда для того, чтобы разобрать ваш JSON réponse, вы просто должны сделать:

Gson gson = new Gson(); 
Response data = gson.fromJson(responseString, Response.class); 

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

data.resultData.gridRecords.transactId; 

Примечание 1 Если вы заинтересованы в большем количестве полей ответ JSON, вы просто должны добавить больше полей к вашим обертывание классов, в соответствии с ответом JSON ...

Примечание 2: Я изменил тип addedTime на String, вместо Date, потому что он выдает исключение для неподготовленной даты. В любом случае, я обычно оставляю типы в объектах Response как простые String, а затем в классе, откуда я получаю ответ, я делаю правильное форматирование при создании своих объектов, например, когда вы помещаете значения в свой Map ...

Примечание 3: использование аннотаций @SerializedName интересно отделить имя поля в ответ JSON и в вашем приложении, чтобы следовать Java именования, которые ваши атрибуты не ниже ...

Примечание 4: Вы не должны использовать атрибуты public в своих классах. Более целесообразно использовать атрибуты private/protected и их корреспондент getters и setters ...

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