2013-08-06 71 views
0

在我的应用我已经解析这个JSON:解析JSON和创建对象

programs.json

{ 
    "programs": { 
    "program": [ 
     { 
     "programNumber": "1", 
     "imgURL": "http://www.photovideolife.com/userfiles/Placeholder%2001.jpg", 
     "description": "Lorem ipsum dolor sit er elit", 
     "episode": [ 
      { 
      "pN": "1", 
      "episodeNumber": "1", 
      "transmissionName": "Titolo", 
      "date": "29 Giu 2013", 
      "time": "14:30", 
      "channel": "Real Time", 
      "channelLogo": "https://lh6.googleusercontent.com/-XSh-9ngYJu4/ThiY-xl2EeI/AAAAAAAABmc/iz04VpL5hOs/s800/realtime.png" 
      }, 
      { 
      "pN": "1", 
      "episodeNumber": "1", 
      "transmissionName": "Titolo", 
      "date": "29 Giu 2013", 
      "time": "16:30", 
      "channel": "DMAX", 
      "channelLogo": "http://tv.zam.it/canali/dmax.png" 
      }, 
      { 
      "pN": "1", 
      "episodeNumber": "2", 
      "transmissionName": "Titolo", 
      "date": "01 Lug 2013", 
      "time": "14:30", 
      "channel": "Real Time", 
      "channelLogo": "https://lh6.googleusercontent.com/-XSh-9ngYJu4/ThiY-xl2EeI/AAAAAAAABmc/iz04VpL5hOs/s800/realtime.png" 
      }, 
      { 
      "pN": "1", 
      "episodeNumber": "2", 
      "transmissionName": "Titolo", 
      "date": "01 Lug 2013", 
      "time": "16:30", 
      "channel": "DMAX", 
      "channelLogo": "http://tv.zam.it/canali/dmax.png" 
      } 
     ] 
     }, 
     { 
     "programNumber": "2", 
     "imgURL": "http://mesa.umich.edu/files/mesa/field/image/placeholder2.png", 
     "description": "Lorem ipsum dolor sit er elit", 
     "Episode": [ 
      { 
      "pN": "2", 
      "episodeNumber": "1", 
      "transmissionName": "Titolo 1", 
      "date": "30 Giu 2013", 
      "time": "13:30", 
      "channel": "Real Time", 
      "channelLogo": "https://lh6.googleusercontent.com/-XSh-9ngYJu4/ThiY-xl2EeI/AAAAAAAABmc/iz04VpL5hOs/s800/realtime.png" 
      }, 
      { 
      "pN": "2", 
      "episodeNumber": "1", 
      "transmissionName": "Titolo 1", 
      "date": "30 Giu 2013", 
      "time": "18:30", 
      "channel": "DMAX", 
      "channelLogo": "http://tv.zam.it/canali/dmax.png" 
      }, 
      { 
      "pN": "2", 
      "episodeNumber": "2", 
      "transmissionName": "Titolo 1", 
      "date": "01 Lug 2013", 
      "time": "13:30", 
      "channel": "Real Time", 
      "channelLogo": "https://lh6.googleusercontent.com/-XSh-9ngYJu4/ThiY-xl2EeI/AAAAAAAABmc/iz04VpL5hOs/s800/realtime.png" 
      }, 
      { 
      "pN": "2", 
      "episodeNumber": "2", 
      "transmissionName": "Titolo 1", 
      "date": "01 Lug 2013", 
      "time": "18:30", 
      "channel": "DMAX", 
      "channelLogo": "http://tv.zam.it/canali/dmax.png" 
      } 
     ] 
     }, 
     { 
     "programNumber": "3", 
     "imgURL": "http://wp.contempographicdesign.com/wp_paramount/wp-content/themes/paramount/images/image_placeholder_lrg.jpg", 
     "description": "Lorem ipsum dolor sit er elit", 
     "Episode": [ 
      { 
      "pN": "3", 
      "episodeNumber": "1", 
      "transmissionName": "Titolo 2", 
      "date": "30 Giu 2013", 
      "time": "10:30", 
      "channel": "Real Time", 
      "channelLogo": "https://lh6.googleusercontent.com/-XSh-9ngYJu4/ThiY-xl2EeI/AAAAAAAABmc/iz04VpL5hOs/s800/realtime.png" 
      }, 
      { 
      "pN": "3", 
      "episodeNumber": "1", 
      "transmissionName": "Titolo 2", 
      "date": "30 Giu 2013", 
      "time": "17:30", 
      "channel": "DMAX", 
      "channelLogo": "http://tv.zam.it/canali/dmax.png" 
      }, 
      { 
      "pN": "3", 
      "episodeNumber": "2", 
      "transmissionName": "Titolo 2", 
      "date": "01 Lug 2013", 
      "time": "10:30", 
      "channel": "Real Time", 
      "channelLogo": "https://lh6.googleusercontent.com/-XSh-9ngYJu4/ThiY-xl2EeI/AAAAAAAABmc/iz04VpL5hOs/s800/realtime.png" 
      }, 
      { 
      "pN": "3", 
      "episodeNumber": "2", 
      "transmissionName": "Titolo 2", 
      "date": "01 Lug 2013", 
      "time": "17:30", 
      "channel": "DMAX", 
      "channelLogo": "http://tv.zam.it/canali/dmax.png" 
      } 
     ] 
     } 
    ] 
    } 
} 

我想创造一些对象,从这个JSON文件存储数据,所以我使用Gson库来使这个解析非常简单。我无法使用此库中创建对象,我创建了4个对象:

  • EpisodeData我在其中存储该信息(PN,episodeNumber,日期,时间,渠道和channelLogo)
  • 情节这是一个EpisodeData
  • 计划的阵列它的情节数组
  • 程序中,我存储阵列计划

这里是对象的代码:

EpisodeData.java

public class EpisodeData implements Serializable { 

    /** 
    * 
    */ 
    private static final long serialVersionUID = 1L; 
    public String pN, episodeNumber, transmissionName, date, time, channel, channelLogo; 
} 

Episode.java

public class Episode implements Serializable { 

    /** 
    * 
    */ 
    private static final long serialVersionUID = 1L; 
    public EpisodeData[] episodeData; 
} 

Program.java

public class Program implements Serializable { 

    /** 
    * 
    */ 
    private static final long serialVersionUID = 1L; 
    public Episode[] episode; 
} 

Programs.java

public class Programs implements Serializable { 

    /** 
    * 
    */ 
    private static final long serialVersionUID = 1L; 
    public Program program; 

} 

所以,我提出(与AsyncHttpClient)连接到从服务器上下载的JSON文件,我开始分析它,但我有麻烦了。我张贴在这里的代码片段:

public void onSuccess(String json) { 
    super.onSuccess(json); 
    Gson decoder = new Gson(); 
    Programs programs = decoder.fromJson(json, Programs.class); 
    Log.d("PROGRAMS", "" + programs.program); 
} 

为什么我不能访问到情节和EpisodeData?为什么当我尝试登录programs.program时,它返回null?

我希望你能帮助我找到这个问题 的解决方案谢谢

+0

您没有为获取数据创建问题类。检查[此演示](https://github.com/lalit3686/GSONDemo) –

+0

你说它的代码不起作用...我试图在我的星系S2,它显示我一个白色的活动 – lucgian84

+0

情节应该尽可能多属性就像你想要解析的一样,按照它们进入json的方式命名。当他们以“ - ”开头时,既不能重命名类,也不能解析它们,因为它们的名称与Gson期望的不同。尝试在调用decoder.fromJson之前尝试使用pN替换-pN,使用episodeNumber替换-episodeNumber等,然后再调用decoder.fromJson,如下所示:json.replaceAll(“ - pN”,“pN”);等等 –

回答

1

问题出在基础对象上。它不应该是程序,而应该是具有“程序”属性的另一个对象。除此之外,Programs对象还有一个Program作为属性的数组,而不是一个实例。

基础对象:

public class JsonRootObject { 

    public Programs programs; 

} 

程序对象:

public class Programs implements Serializable { 

    private static final long serialVersionUID = 1L; 
    public Program []program; 

} 

程序对象:

public class Program implements Serializable { 

    private static final long serialVersionUID = 1L; 
    public Episode[] episode; 
} 

情节对象:

public class Episode implements Serializable { 

    private static final long serialVersionUID = 1L; 
    public String pN, episodeNumber, transmissionName, date, time, channel, channelLogo; 
    @Override 
    public String toString() { 
     return "Episode [pN=" + pN + ", episodeNumber=" + episodeNumber 
       + ", transmissionName=" + transmissionName + ", date=" 
       + date + ", time=" + time + ", channel=" + channel 
       + ", channelLogo=" + channelLogo + "]"; 
    } 
} 

EpisodeData不是必需的,因为Episode是最后一级。

最后,你可以用它解析:

Gson decoder = new Gson(); 
JsonRootObject programs = decoder.fromJson(json, JsonRootObject.class); 

我添加了一个toString方法,以集类来测试解析器,这是结果:

System.out.println(programs.programs.program[0].episode[0]); 

08-06 05:31:58.236: I/System.out(1249): Episode [pN=1, episodeNumber=1, transmissionName=Titolo, date=29 Giu 2013, time=14:30, channel=Real Time, channelLogo=https://lh6.googleusercontent.com/-XSh-9ngYJu4/ThiY-xl2EeI/AAAAAAAABmc/iz04VpL5hOs/s800/realtime.png] 

希望帮助:)

+0

它的工作原理!非常感谢你! – lucgian84

0

我想你应该添加@@ SerializedName(“ - PN”)上述领域的PN声明,这样做是为了其他领域太。

+0

我已经在我的问题中更新了我的JSON,看一看 – lucgian84