Java,将JSON数组存储到类并从其他类调用它

时间:2014-10-22 08:56:58

标签: java arrays json jackson stringbuilder

我正在尝试从另一个类中的类中提取数据并使用数据填充JPanel,但由于某种原因它无法正常工作。

这是完整的restConnector类,我在其中提取JSON数据。 据我所知,这很好用。

public class restConnector {

private static final Logger LOGGER = LoggerFactory.getLogger(restConnector.class);

private static final restConnector INSTANCE = new restConnector();


public static restConnector getInstance() {
    return restConnector.INSTANCE;
}

private restConnector(){        
}

private static String user = "ss";
private static String pwd = "ee


public static String encode(String user, String pwd) { 
    final String credentials =  user+":"+pwd; 
    BASE64Encoder encoder = new sun.misc.BASE64Encoder(); 
    return encoder.encode(credentials.getBytes()); 
} 


//Open REST connection
public static void init() {
    restConnector.LOGGER.info("Starting REST connection...");


    try {

        Client client = Client.create();
        client.addFilter(new LoggingFilter(System.out));

        WebResource webResource = client.resource("https://somewebpage.com/

        String url = "activepersonal";






        ClientResponse response = webResource
                    .path("api/alerts/")
                    .queryParam("filter", ""+url)                       
                    .header("Authorization", "Basic "+encode(user, pwd))
                    .header("x-api-version", "1")       
                    .accept("Application/json")
                    .get(ClientResponse.class);


        if (response.getStatus() != 200) {             

        }else{
            restConnector.LOGGER.info("REST connection STARTED.");
        }


        String output = response.getEntity(String.class);       



        ObjectMapper mapper = new ObjectMapper();           
         mapper.setPropertyNamingStrategy(new MyNameStrategy());

         try {
         List<Alert> alert = mapper.readValue(output, new TypeReference<List<Alert>>(){});



         } catch (JsonGenerationException e) {

                e.printStackTrace();

            } catch (JsonMappingException e) {

                e.printStackTrace();

            } catch (IOException e) {

                e.printStackTrace();

            }

      } catch (Exception e) {

        e.printStackTrace();            

      }


}

public void close() {

}

}

但是,当我尝试在另一个类中提取数据时,它只给出了refreshData()方法内的system.out.print中的空值。这是应该打印数据的代码

   public class Application{


    Alert alerts = new Alert();


    public Application() {            
        refreshData();
    }

    private void initComponents() {
        restConnector.init();
        refreshData();          
    }

    private void refreshData() {
        System.out.println("appalertList: "+alerts.getComponentAt(0));
    }
}

这是我的警报课

@JsonIgnoreProperties(ignoreUnknown = true)
@JsonInclude(Include.NON_EMPTY)
public class Alert {

    private int pasID;
    private String status;
    private boolean shared;
    private String header;
    private String desc;

    public int getPasID() {
        return pasID;
    }

    public void setPasID(int pasID) {
        this.pasID = pasID;
    }

    public String getStatus() {
        return status;
    }

    public void setStatus(String status) {
        this.status = status;
    }
    public boolean isShared() {
        return shared;
    }

    public void setShared(boolean shared) {
        this.shared = shared;
    }

    public String getHeader() {
        return header;
    }
    public void setHeader(String header) {
        this.header = header;
    }
    public String getDesc() {
        return desc;
    }
    public void setDesc(String desc) {
        this.desc = desc;
    }

    @Override
    public String toString() {

        StringBuilder sb = new StringBuilder();
        sb.append("\n***** Alert Details *****\n");
        sb.append("PasID="+getPasID()+"\n");
        sb.append("Status="+getStatus()+"\n");
        sb.append("Shared="+isShared()+"\n");
        sb.append("Header="+getHeader()+"\n");
        sb.append("Description="+getDesc()+"\n");
        sb.append("*****************************");

        return sb.toString();

    }

    public String getComponentAt(int i) {

        return toString();
    }

}

我很沮丧,已经被困在这里已经有好几天了所以所有的帮助都会非常感激。感谢您的帮助。

编辑:稍微格式化代码并删除NullPointerException,因为它不再发生。

1 个答案:

答案 0 :(得分:1)

如评论中所述:

  

我:在您的第一段代码中,您拥有此try { List<Alert> alert..,但您对新声明的提醒List<Alert>完全没有任何帮助。这是数据应该来自哪里?

     

OP:我的印象是,该位代码是将JSON数组推送到Alert.class的代码。那里有什么我想念的吗?

     

我:是什么让你觉得它做到了?它只是读取json,Alert.class参数是类类型参数,因此映射器知道在创建Alert对象时应将结果映射到Alert属性。这就是做List<Alert>的可能性,因为Alert.classT中传递了List<T>List<Alert>是从阅读中返回的内容,但您必须确定对列表实际执行的操作。目前,你完全不做任何事情

你可能想稍微改变一下课程。

现在这绝不是一个好的设计,只是一个如何让它工作的例子。我会花一些时间坐下来思考你希望如何充分利用restConnector

话虽如此,您可以在List<Alert> alerts;班级中拥有restConnector班级成员。并有一个吸气剂

public class restConnector {

    private List<Alert> alerts;

    public List<Alert> getAlerts() {
        return alerts;
    }
    ...
}

然后,当使用映射器进行反序列化时,值分配给private List<Alert> alerts。你正在做的是声明一个新的本地范围列表。而不是

try {
    List<Alert> alert = mapper.readValue...

改为执行此操作

try {
    alerts = mapper.readValue

现在为类成员分配了一个值。因此,在Application课程中,您可以执行类似

的操作
public class Application {

    List<Alert> alerts;
    restConnector connect;

    public Application() {
        initComponents();
    }

    private void initComponents() {
        connector = restConnector.getInstance();
        connector.init();
        alerts = connector.getAlerts();
        refreshData();          
    }   

    private void refreshData() {
        StringBuilder sb = new StringBuilder();
        for (Alert alert : alerts) {
            sb.append(alert.toString()).append("\n");
        }
        System.out.println("appalertList: "+ sb.toString());
    }     
}

现在您可以访问列表中的Alert

但请允许我重申:这是一个可怕的设计。例如,您将init方法限制为单个调用,在该调用中,它只能获取一个且只能获得一个资源。如果其他服务需要访问其他资源怎么办?你已经完成了请求,所以你不能。

花一些时间考虑一些好的OOP设计,其中该类可以用于不同的场景。