Как мне структурировать мои данные, чтобы перейти от использования ParseJsonArray / ParseJsonObject к использованию GSON.fromJson (...) - PullRequest
1 голос
/ 01 февраля 2012

Я работал с GSON, чтобы попытаться проанализировать ответ Json, полученный от сервера CakePHP, около недели. Вот как выглядит ответ:

[{"BaseObject":  {"field1":"1","field2":"1639","field3":"10","field4":"1","field5":"12","field6":"10.765984","field7":"-25.768357","field8":"1327790850"}},{"BaseObject":{"field1":"2","field2":"1934","field3":"19","field4":"30","field5":"2","field6":"10.758662","field7":"-25.769684","field8":"1327790850"}},{"BaseObject":{"field1":"3","field2":"2567","field3":"33","field4":"6","field5":"98","field6":"10.758786","field7":"-25.769843","field8":"1327790850"}},{"BaseObject":{"field1":"4","field2":"0","field3":"33","field4":"7","field5":"0","field6":"10.758786","field7":"-20.769843","field8":"1327790850"}},{"BaseObject":{"field1":"5","field2":"1097","field3":"33","field4":"1","field5":"0","field6":"15.758786","field7":"50.769843","field8":"1327790850"}},{"BaseObject":{"field1":"6","field2":"1936","field3":"50","field4":"0","field5":"9","field6":"19.234987","field7":"-67.340065","field8":"1327798560"}}] 

Я использовал плагин для Notepad ++, чтобы убедиться, что ответ правильный Json, и это так.

Сначала я попробовал эту функцию:

public static List<BaseObject> parserInputStreamGson(InputStream stream)
{ 
  List<BaseObject> objList = new ArrayList<BaseObject>();

  if(stream != null){
    Gson gson = new Gson();
    Reader r = new InputStreamReader(stream);

    Log.d(TAG,"Trying to Parse Reader");
    try{
        objList = gson.fromJson(r, new TypeToken<List<BaseObject>>() {}.getType() );
       } catch (JsonSyntaxException e) {
           Log.d(TAG, "JsonSyntaxException : " + e.getMessage() );
       } catch (JsonIOException e) {
           Log.d(TAG, "JsonIOException : " + e.getMessage() );
       } finally {
           try {
               r.close();
           } catch (IOException e) {
               Log.d(TAG, "IOException : " + e.getMessage() );
           }
       }
  }
  Log.d(TAG,"BaseObject[] = " + objList.toString());
  return objList;
}

Тогда я попробовал эту функцию:

public static BaseObject[] parserInputStreamGsonArray(InputStream stream)
{
  BaseObject[] objectArray = null;
  if (stream != null) {
    Gson gson = new Gson();
    Reader r = new InputStreamReader(stream);

    Log.d(TAG, "Trying to Parse Reader");
    try {
        objectArray = gson.fromJson(r, new TypeToken<Event[]>() {}.getType());
    } catch (JsonSyntaxException e) {
        Log.d(TAG, "JsonSyntaxException : " + e.getMessage());
    } catch (JsonIOException e) {
        Log.d(TAG, "JsonIOException : " + e.getMessage());
    } finally {
        try {
            r.close();
        } catch (IOException e) {
            Log.d(TAG, "IOException : " + e.getMessage());
        }
    }
  }
  if(eventArray != null){
    for(int m=0;m<eventArray.length;m++){
        Log.d(TAG, "objectArray[" + String.valueOf(m) + "] = " + objectArray[m].toString());
    }
   }    
  return objectArray;
}

И в обоих случаях Gson вернул 5 объектов, но все поля были установлены на ноль.

Наконец-то я получил эту функцию, но она кажется неуклюжей.

public static List<BaseObject> ParseInputStream(InputStream stream) {
    Reader r = new InputStreamReader(stream);
    List<BaseObject> baseObjectList = new ArrayList<BaseObject>();

    try {
        JsonParser parser = new JsonParser();
        JsonArray array = parser.parse(r).getAsJsonArray();
        JsonObject topObject = new JsonObject();
        JsonObject subObject = new JsonObject();

        for (int m = 0; m < array.size(); m++) {
            if (array.get(m).isJsonObject()) {
                topObject = array.get(m).getAsJsonObject();

                if (topObject.get("BaseObject").isJsonObject()) {
                    subObject = topObject.get("BaseObject").getAsJsonObject();

                    BaseObject baseobject = new BaseObject();

                    baseobject.field1 = subObject.get("field1").getAsLong();
                    baseobject.field2 = subObject.get("field2").getAsInt();
                    baseobject.field3 = subObject.get("field3").getAsLong();
                    baseobject.field4 = subObject.get("field4").getAsInt();
                    baseobject.field5 = subObject.get("field5").getAsInt();
                    baseobject.field6 = subObject.get("field6").getAsDouble();
                    baseobject.field7 = subObject.get("field7").getAsDouble();
                    baseobject.field8 = subObject.get("field8").getAsLong();

                    baseObjectList.add(baseobject);
                } else {
                    Log.e(TAG, "topObject[" + String.valueOf(m)+ "].subObject is not a JsonObject");
                }

            } else {
                Log.e(TAG, "Array # " + String.valueOf(m)+ " is not a JsonObject!");
            }
        }
    } catch (Exception ex) {
        Log.e(TAG, "Exception thrown = " + ex.toString());
        ex.printStackTrace();
    }
    return baseObjectList;
}  

Вот класс, который я создал для BaseObject.

public class BaseObject {

@SerializedName("field1")
public long field1;
@SerializedName("field2")
public int field2;
@SerializedName("field3")
public long field3;
@SerializedName("field4")
public int field4;
@SerializedName("field5")
public int field5;
@SerializedName("field6")
public double field6;
@SerializedName("field7")
public double field7;
@SerializedName("field8")
public long field8;

@Override
public String toString() {
    return  "(" + 
            "field1= " + String.valueOf(this.field1) + ", " +
            "field2= " + String.valueOf(this.field2) + ", " +
            "field3= " + String.valueOf(this.field3) + ", " +
            "field4= " + String.valueOf(this.field4) + ", " +
            "field5= " + String.valueOf(this.field5) + ", " +
            "field6= " + String.valueOf(this.field6) + ", " +
            "field7= " + String.valueOf(this.field7) + ", " +
            "field8= " + String.valueOf(this.field8) +
            ")";
}

}

Может кто-нибудь сказать мне, как мне нужно структурировать свои классы данных, чтобы использовать Gson.fromJson для работы.

1 Ответ

0 голосов
/ 01 февраля 2012

Поскольку ваш ответ на самом деле List<BaseObject>, вы должны использовать List baseObjectList = new Gson (). FromJson (r, new TypeToken> () {} .getType ())

Также я должен отметить, что вам не нужно использовать аннотации @SerializedName, поскольку имена ваших атрибутов в ответе json и в классе одинаковы.

ОБНОВЛЕНИЕ: Упс .. Извините, я должен был попробовать ваш код, прежде чем ответить.Пожалуйста, обратитесь к следующему коду.Все сводилось к структурированию классов.

public class Sample {

    public static class Wrapper{
        private BaseObject BaseObject;
        @Override
        public String toString() {          
            return BaseObject == null? null : BaseObject.toString();
        }
    }

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        String json = "[{\"BaseObject\":  {\"field1\":\"1\",\"field2\":\"1639\",\"field3\":\"10\",\"field4\":\"1\",\"field5\":\"12\",\"field6\":\"10.765984\",\"field7\":\"-25.768357\",\"field8\":\"1327790850\"}},{\"BaseObject\":{\"field1\":\"2\",\"field2\":\"1934\",\"field3\":\"19\",\"field4\":\"30\",\"field5\":\"2\",\"field6\":\"10.758662\",\"field7\":\"-25.769684\",\"field8\":\"1327790850\"}},{\"BaseObject\":{\"field1\":\"3\",\"field2\":\"2567\",\"field3\":\"33\",\"field4\":\"6\",\"field5\":\"98\",\"field6\":\"10.758786\",\"field7\":\"-25.769843\",\"field8\":\"1327790850\"}},{\"BaseObject\":{\"field1\":\"4\",\"field2\":\"0\",\"field3\":\"33\",\"field4\":\"7\",\"field5\":\"0\",\"field6\":\"10.758786\",\"field7\":\"-20.769843\",\"field8\":\"1327790850\"}},{\"BaseObject\":{\"field1\":\"5\",\"field2\":\"1097\",\"field3\":\"33\",\"field4\":\"1\",\"field5\":\"0\",\"field6\":\"15.758786\",\"field7\":\"50.769843\",\"field8\":\"1327790850\"}},{\"BaseObject\":{\"field1\":\"6\",\"field2\":\"1936\",\"field3\":\"50\",\"field4\":\"0\",\"field5\":\"9\",\"field6\":\"19.234987\",\"field7\":\"-67.340065\",\"field8\":\"1327798560\"}}]";

        List<Wrapper> results = new Gson().fromJson(json,new TypeToken<List<Wrapper>>(){}.getType());
        System.out.println(results);
    }
}

Просто любопытно, можете ли вы изменить ответ JSON, поступающий с сервера?ИМХО, его структура немного сложна.

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