2015-12-18 4 views
3

Хорошо, так что это то, что я работаю с api, что для одного параметра JSON можно вернуть два разных типа. Поэтому я могу получать с сервера либо объект JSON, либо строку. Я довольно новичок в разработке Android, поэтому, если кто-то может объяснить мне, может быть, пример кода, как я могу справиться с этой проблемой.Android GSON POJO дополнительный синтаксический анализ поля

Примеры ответов json {video: "ID VIDEO"} или {video: {id: "ID ВИДЕО", ... дополнительные данные}}. Я посмотрел на пользовательские десеризаторы, но не могу найти пример, который легко поддается наблюдению. Должен быть простой способ решить мою проблему. В настоящее время я получаю ошибку «Прогнозную строку, но нашел НАЧАТЬ ОБЪЕКТ»

import com.google.gson.annotations.Expose; 
import com.google.gson.annotations.SerializedName; 

public class MyNotification { 
    @SerializedName("_id") 
    @Expose 
    private String Id; 
    @SerializedName("comment") 
    @Expose 
    private String comment; 
    @SerializedName("createdAt") 
    @Expose 
    private String createdAt; 
    @SerializedName("message") 
    @Expose 
    private String message; 
    @SerializedName("read") 
    @Expose 
    private Boolean read; 
    @SerializedName("recipient") 
    @Expose 
    private String recipient; 
    @SerializedName("sender") 
    @Expose 
    private User sender; 
    @SerializedName("type") 
    @Expose 
    private String type; 
//  @SerializedName("video") 
//  @Expose 
//  private String video; 

    /** 
    * 
    * @return 
    * The Id 
    */ 
    public String getId() { 
     return Id; 
    } 

    /** 
    * 
    * @param Id 
    * The _id 
    */ 
    public void setId(String Id) { 
     this.Id = Id; 
    } 

    /** 
    * 
    * @return 
    * The comment 
    */ 
    public String getComment() { 
     return comment; 
    } 

    /** 
    * 
    * @param comment 
    * The comment 
    */ 
    public void setComment(String comment) { 
     this.comment = comment; 
    } 

    /** 
    * 
    * @return 
    * The createdAt 
    */ 
    public String getCreatedAt() { 
     return createdAt; 
    } 

    /** 
    * 
    * @param createdAt 
    * The createdAt 
    */ 
    public void setCreatedAt(String createdAt) { 
     this.createdAt = createdAt; 
    } 

    /** 
    * 
    * @return 
    * The message 
    */ 
    public String getMessage() { 
     return message; 
    } 

    /** 
    * 
    * @param message 
    * The message 
    */ 
    public void setMessage(String message) { 
     this.message = message; 
    } 

    /** 
    * 
    * @return 
    * The read 
    */ 
    public Boolean getRead() { 
     return read; 
    } 

    /** 
    * 
    * @param read 
    * The read 
    */ 
    public void setRead(Boolean read) { 
     this.read = read; 
    } 

    /** 
    * 
    * @return 
    * The recipient 
    */ 
    public String getRecipient() { 
     return recipient; 
    } 

    /** 
    * 
    * @param recipient 
    * The recipient 
    */ 
    public void setRecipient(String recipient) { 
     this.recipient = recipient; 
    } 

    /** 
    * 
    * @return 
    * The sender 
    */ 
    public User getSender() { 
     return sender; 
    } 

    /** 
    * 
    * @param sender 
    * The sender 
    */ 
    public void setSender(User sender) { 
     this.sender = sender; 
    } 

    /** 
    * 
    * @return 
    * The type 
    */ 
    public String getType() { 
     return type; 
    } 

    /** 
    * 
    * @param type 
    * The type 
    */ 
    public void setType(String type) { 
     this.type = type; 
    } 

//  /** 
//   * 
//   * @return 
//   * The video 
//   */ 
//  public String getVideo() { 
//   return video; 
//  } 
// 
//  /** 
//   * 
//   * @param video 
//   * The video 
//   */ 
//  public void setVideo(String video) { 
//   this.video = video; 
//  } 

} 

и ту часть, которая крэпс из

Gson gson = new Gson(); 
String jsonString = String.valueOf(dataset); 
Type listType = new TypeToken<List<MyNotification>>(){}.getType(); 
notficationsList = (List<MyNotification>) gson.fromJson(jsonString, listType); 
+0

Пожалуйста, ваш код –

+0

Post моего код? Не совсем уверен, как это будет какая-то помощь? Вы имеете в виду мое определение POJO? –

+0

Да, ваше определение POJO может помочь, часть Java, которая тоже выбрасывает Exception –

ответ

0

ИТАК решение, которое я пошел, я написал свой собственный адаптер типа, который позволит вам использовать

public class Helper_StringAdapter extends TypeAdapter<String>{ 
@Override 
public String read(com.google.gson.stream.JsonReader in) throws IOException { 
    if(in.peek() == JsonToken.NULL){ 
     in.nextNull(); 
     return null; 
    }else if(in.peek() == JsonToken.BEGIN_OBJECT && in.getPath().contains(".video")){ 
     L.e("VIDEO IS AN OBJECT!"); 
     String userId = readAndReturnVideoId(in); 
     return userId; 
    }else{ 
     return in.nextString(); 
    } 
} 

private String readAndReturnVideoId(com.google.gson.stream.JsonReader reader) throws IOException{ 
    String id = ""; 
    reader.beginObject(); 
    while(reader.hasNext()){ 
     String name = reader.nextName(); 
     if(name.equals("_id")){ 
      id = reader.nextString(); 
     }else{ 
      reader.skipValue(); 
     } 
    } 
    reader.endObject(); 
    L.e("READ ID RETURNED"+id); 
    return id; 
} 

@Override 
public void write(com.google.gson.stream.JsonWriter out, String value) throws IOException { 
    L.e("TEST "+out); 
} 
} 

Затем в моей деятельности менеджере данных (Recyclerview адаптер)

public void updateData (JSONArray dataset) { 
    GsonBuilder gsonb = new GsonBuilder(); 
    gsonb.registerTypeAdapter(String.class,new Helper_StringAdapter()); 
    Gson gson = gsonb.create(); 

    String jsonString = String.valueOf(dataset); 
    Type listType = new TypeToken<List<FrameNotification>>(){}.getType(); 
    notficationsList = (List<FrameNotification>) gson.fromJson(jsonString, listType); 
} 

Кажется, чтобы сделать работу

1

К сожалению она так долго:

Лучше отремонтировать JSON , если вы должны сопоставить его с объектом.

Попробуйте очистить JSON с этим кодом:

public static String cleanJson(String json) { 
    int videoPos = json.indexOf("video"); 
    if(videoPos == -1) { 
     return json; //return, no video here 
    } 
    boolean isObject = false; 

    int objectBegin = -1; 
    String cleanedJson = json.replaceAll("\\\"", "\\\\"); 
    for(int i = videoPos; i < cleanedJson.length(); i++) { 
     if(cleanedJson.charAt(i) == '"') { 
      System.out.println("string"); 
      return json; // its a string anyway 
     } 
     if(cleanedJson.charAt(i) == '{') { 
      //its an object 
      // i now is the position beginning the object 
      objectBegin = i; 
     } 
    } //replace " with space 
    if(objectBegin == -1) {// we did not find any { or " it is a string 
     return json; 
    } 
    boolean inString = false; 
    int objectEnd = -1; 
    for(int i = objectBegin; i < cleanedJson.length(); i++) { 
     //looking for the end of the object; 
     if(cleanedJson.charAt(i) == '"') inString = !inString; 
     if(cleanedJson.charAt(i) == '}') { 
      objectEnd = i; 
      break; 
     } 
    } 
    if(objectEnd != -1) { 
     String start = json.substring(0,objectBegin); 
     String videoPart = json.substring(objectBegin, objectEnd+1); 
     String end = json.substring(objectEnd+1); 
     // now we want to get the id 
     String newVideoPart = ""; 
     int idStart = videoPart.indexOf("id"); 
     int idStringStart = -1; 
     int idStringEnd = -1; 

     for(int i = idStart; i < videoPart.length(); i++) { 
      if(videoPart.charAt(i) == '"') { 
       if(idStringStart == -1) { 
        idStringStart = i; 
       } else { 
        idStringEnd = i; 
        break; 
       } 
      } 
     } 
     if(idStringStart != -1 && idStringEnd != -1) { 
      newVideoPart = videoPart.substring(idStringStart, idStringEnd+1); 
     } 

     return start+newVideoPart+end; 
    } 
    return json; 
} 

работает с этими двумя тестовыми jsons:

System.out.println(cleanJson("{video:\"1234\"}")); 
System.out.println(cleanJson("{video:{id:\"2345\", name=\"test\"}}")); 

Try это так:

notficationsList = (List<MyNotification>) gson.fromJson(cleanJson(jsonString), listType); 
+0

Я ожидал, что вам понадобится идентификатор vido. конечно, вы могли бы обернуть его и всегда делать из него объект. и вы могли бы сделать вещи проще с библиотеками. поэтому результат: вы всегда будете получать идентификатор видео в виде строки с названием видео –

+0

Хорошо, я так и думал. благодаря –

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