1

json データを Java クラスに割り当てるのに問題があります。誰か助けてください。私の 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);
  }
}

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"
}
4

1 に答える 1

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 応答を解析するには、次のことを行う必要があります。

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

任意のフィールドにアクセスできます。たとえば、次のようになります。

data.resultData.gridRecords.transactId;

注 1 : JSON 応答のより多くのフィールドに関心がある場合は、JSON 応答に従って、ラップクラスにフィールドを追加するだけです...

注 2 : の型を に変更しましたaddedTime。これは、解析できない日付の例外をスローするためではありませんStringDateとにかく、私は通常、Responseオブジェクトの型を単純なままStringにしてから、応答を取得するクラスで、オブジェクトの作成中に正しいフォーマットを行います。たとえば、値をMap...

注 3 : アノテーションの使用は、@SerializedName属性が従わない Java 命名規則に従うために、JSON 応答とアプリ内のフィールドの名前を分離するのに興味深いものです...

注 4 :publicクラスで属性を使用しないでください。private/protected属性とそれに対応するものgettersを使用することをお勧めしますsetters...

于 2013-04-16T12:34:57.843 に答える