有问题用java收集Json对象和数组

时间:2017-06-22 18:35:08

标签: java android

首先,我是新手,所以请原谅我。一直在研究音乐应用程序,我试图从流媒体链接解析JSON代码,并向我的应用程序用户显示歌曲的“艺术家”名称和“标题”。但我收集数据时遇到问题。  这是来自流媒体链接的JSON代码:

{"type":"result","data":[{"title":"My Stream ","song":"Unknown - The Authorised One","track":{"artist":"Unknown Artist","title":"The Authorised One","album":"Unknown","royaltytrackid":181938.0000,"started":1498151105,"id":181938,"length":0,"playlist":{"id":3520,"title":"Rev Arome E. Adah"},"buyurl":"https:\/\/itunes.apple.com\/us\/album\/the-unknown-god\/id772022436?uo=4","imageurl":"http:\/\/is5.mzstatic.com\/image\/thumb\/Music5\/v4\/d7\/6d\/52\/d76d52df-db43-7130-0e37-62241ff50a21\/source\/100x100bb.jpg"},"bitrate":"128 Kbps","server":"Online","autodj":"Online","source":"Yes","offline":false,"summary":"<a href=\"http:\/\/cp9.serverse.com:2199\/tunein\/-stream\/svhxmwhp.pls\">Eloti Designs Stream - Unknown - The Authorised One<\/a>","listeners":0,"maxlisteners":1000,"reseller":0,"serverstate":true,"sourcestate":true,"sourceconn":1,"date":"Jun 22, 2017","time":"07:06 PM","rawmeta":"Unknown - The Authorised One ","mountpoint":"\/stream","tuneinurl":"http:\/\/209.133.216.3:7550\/stream","directtuneinurl":"","proxytuneinurl":"http:\/\/209.133.216.3\/proxy\/svhxmwhp?mp=\/stream","tuneinformat":"mp3","webplayer":"muses","servertype":"ShoutCast2","listenertotal":0,"url":"http:\/\/cp9.serverse.com:2199\/rpc"}]

我使用此代码将“艺术家”名称“Unkwown Artist”发布到我的文本字段,但它对我不起作用。

JSONObject parentObject = new JSONObject(finalJson);
                JSONArray parentArray = parentObject.getJSONArray("data");
                JSONObject finalObject = parentArray.getJSONObject(0);
                String songName = finalObject.getString("artist");
                return songName;

2 个答案:

答案 0 :(得分:1)

track是一个包含artist的jsonobject,track位于jsonobject的第一个datatrack数组,以便获取artist,然后从中获取String songName = finalObject.getJSONObject("track").getString("artist"); { "type":"result", "data":[ // fetch JSONArray { // fetch first JSONObject "title":"My Stream ","song":"Unknown - The Authorised One", "track":{ // fetch track JSONObject "artist":"Unknown .." // fetch string

org.springframework.context.ApplicationContextException: Unable to start embedded container; nested exception is java.lang.IllegalStateException: Filters can not be added to context /ROOT as the context has been initialised
at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.onRefresh(EmbeddedWebApplicationContext.java:137) ~[spring-boot-1.5.2.RELEASE.jar:1.5.2.RELEASE]
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:536) ~[spring-context-4.3.7.RELEASE.jar:4.3.7.RELEASE]
at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:122) ~[spring-boot-1.5.2.RELEASE.jar:1.5.2.RELEASE]
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:737) ~[spring-boot-1.5.2.RELEASE.jar:1.5.2.RELEASE]
at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:370) ~[spring-boot-1.5.2.RELEASE.jar:1.5.2.RELEASE]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:314) ~[spring-boot-1.5.2.RELEASE.jar:1.5.2.RELEASE]
at org.springframework.cloud.context.restart.RestartEndpoint.restart(RestartEndpoint.java:160) [spring-cloud-context-1.1.8.RELEASE.jar:1.1.8.RELEASE]
at org.springframework.cloud.context.restart.RestartEndpoint.invoke(RestartEndpoint.java:94) [spring-cloud-context-1.1.8.RELEASE.jar:1.1.8.RELEASE]
at org.springframework.cloud.context.restart.RestartEndpoint.invoke(RestartEndpoint.java:43) [spring-cloud-context-1.1.8.RELEASE.jar:1.1.8.RELEASE]
at org.springframework.boot.actuate.endpoint.mvc.AbstractEndpointMvcAdapter.invoke(AbstractEndpointMvcAdapter.java:56) [spring-boot-actuator-1.5.2.RELEASE.jar:1.5.2.RELEASE]
at org.springframework.boot.actuate.endpoint.mvc.EndpointMvcAdapter.invoke(EndpointMvcAdapter.java:42) [spring-boot-actuator-1.5.2.RELEASE.jar:1.5.2.RELEASE]
at org.springframework.cloud.context.restart.RestartMvcEndpoint.access$001(RestartMvcEndpoint.java:34) [spring-cloud-context-1.1.8.RELEASE.jar:1.1.8.RELEASE]
at org.springframework.cloud.context.restart.RestartMvcEndpoint$1.run(RestartMvcEndpoint.java:51) [spring-cloud-context-1.1.8.RELEASE.jar:1.1.8.RELEASE]
at java.lang.Thread.run(Thread.java:744) [na:1.7.0_51]

Caused by: java.lang.IllegalStateException: Filters can not be added to context /ROOT as the context has been initialised
at org.apache.catalina.core.ApplicationContext.addFilter(ApplicationContext.java:1006) ~[catalina.jar:7.0.67]
at org.apache.catalina.core.ApplicationContext.addFilter(ApplicationContext.java:971) ~[catalina.jar:7.0.67]
at org.apache.catalina.core.ApplicationContextFacade.addFilter(ApplicationContextFacade.java:454) ~[catalina.jar:7.0.67]
at org.springframework.boot.web.servlet.AbstractFilterRegistrationBean.onStartup(AbstractFilterRegistrationBean.java:225) ~[spring-boot-1.5.2.RELEASE.jar:1.5.2.RELEASE]
at org.springframework.boot.web.servlet.FilterRegistrationBean.onStartup(FilterRegistrationBean.java:42) ~[spring-boot-1.5.2.RELEASE.jar:1.5.2.RELEASE]
at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.selfInitialize(EmbeddedWebApplicationContext.java:229) ~[spring-boot-1.5.2.RELEASE.jar:1.5.2.RELEASE]
at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.access$000(EmbeddedWebApplicationContext.java:89) ~[spring-boot-1.5.2.RELEASE.jar:1.5.2.RELEASE]
at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext$1.onStartup(EmbeddedWebApplicationContext.java:213) ~[spring-boot-1.5.2.RELEASE.jar:1.5.2.RELEASE]
at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.createEmbeddedServletContainer(EmbeddedWebApplicationContext.java:168) ~[spring-boot-1.5.2.RELEASE.jar:1.5.2.RELEASE]
at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.onRefresh(EmbeddedWebApplicationContext.java:134) ~[spring-boot-1.5.2.RELEASE.jar:1.5.2.RELEASE]
... 13 common frames omitted

答案 1 :(得分:0)

你有没有尝试过杰克逊解析器?它非常易于使用,可以轻松解析上面的字符串。您需要做的就是创建3/4 POJO类来映射您的结构,然后将Mapper的readValue函数应用于外部类。以下是一个包​​含List和一个内部类的小例子:

import java.io.IOException;
import java.util.List;

import com.fasterxml.jackson.core.JsonParseException;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.ObjectMapper;

class OutterPojo {

    public String aString;
    public List<InnerPojo> aList;

    public String getaString() {
        return aString;
    }

    public void setaString(String aString) {
        this.aString = aString;
    }

    public List<InnerPojo> getaList() {
        return aList;
    }

    public void setaList(List<InnerPojo> aList) {
        this.aList = aList;
    }

    @Override
    public String toString() {
        return new StringBuilder().append("{ #OutterPojo# ").append("aString:").append(aString).append(", ").append("aList:")
                .append(aList).append(" }").toString();
    }
}

class InnerPojo {

    public String anotherString;

    public String getanotherString() {
        return anotherString;
    }

    public void setanotherString(String anotherString) {
        this.anotherString = anotherString;
    }

    @Override
    public String toString() {
        return new StringBuilder().append("{ #InnerPojo# ").append("anotherString:").append(anotherString).append(" }")
                .toString();
    }
}

public class Test {

    public static void main(String args[]) throws JsonParseException, JsonMappingException, IOException {
        String jsonData = "{\"aString\":\"s\",\"aList\":[{\"anotherString\":\"ss\"},{\"anotherString\":\"sss\"}]}";
        ObjectMapper objectMapper = new ObjectMapper();
        OutterPojo testObject = objectMapper.readValue(jsonData, OutterPojo.class);
        System.out.println(testObject);
    }

}

至于依赖关系,你需要的就是jackson-core,jackson-databind和jackson-annotations - 这里是maven的链接: https://mvnrepository.com/artifact/com.fasterxml.jackson.core

希望它有所帮助! :)