Java,将JSON数组存储到类中,并从其他类调用它
我试图从另一个类中的类中提取数据,并用数据填充JPanel,但由于某些原因它无法工作 这里是完整的restConnector类,我在其中提取JSON数据。 据我所知,这很好用Java,将JSON数组存储到类中,并从其他类调用它,java,arrays,json,jackson,stringbuilder,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 = ne
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() {
}
这是我的警觉课
@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,因为它不再发生。如注释中所述:
Me:在您的第一段代码中,您有这样一个
尝试{List alert..
,但是您对新声明的警报List
完全不做任何操作。数据应该从这里来吗
OP:我的印象是,这段代码就是将JSON数组推送到Alert.class
的代码。我有什么遗漏吗
Me:是什么让你这么认为的?它所做的只是读取json,而警报。class
参数是class-type参数,因此映射程序知道在创建警报
对象时,结果应该映射到警报
属性。这就是列表
的可能方式,因为se传递警报。class
在List
中描述T
。List
是从读取中返回的内容,但您必须确定如何实际处理该列表。而目前,您对其完全不做任何处理
你也许想改变一下课程
现在,这绝不是一个好的设计,只是一个如何让它工作的示例。我会花一些时间坐下来思考一下您希望如何充分利用restConnector
也就是说,您可以在restConnector
类中拥有一个列表警报;
类成员,并拥有一个getter
public class restConnector {
private List<Alert> alerts;
public List<Alert> getAlerts() {
return alerts;
}
...
}
现在,类成员被分配了一个值。因此,在应用程序中,您可以执行如下操作
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());
}
}
公共类应用程序{
列出警报;
重新连接连接器;
公共应用程序(){
初始化组件();
}
私有组件(){
connector=restConnector.getInstance();
connector.init();
警报=connector.getAlerts();
刷新数据();
}
私有数据(){
StringBuilder sb=新的StringBuilder();
用于(警报:警报){
sb.append(alert.toString()).append(“\n”);
}
System.out.println(“appalertList:+sb.toString());
}
}
现在您可以访问列表中的警报
但让我重申:这是一个可怕的设计。对于其中一个,您将init
方法限制为一个调用,在该调用中,它只能获得一个且只有一个资源。如果rest服务需要访问另一个资源,该怎么办?您已将请求设置为一成不变,因此无法执行
花些时间考虑一些好的OOP设计,在这些设计中,类可以用于不同的场景。如果您可以提供NullPointerException的跟踪,并让我们知道NullPointerException发生在代码的哪一行,可能会有所帮助。这是一个控制台打印:private void refreshData(){System.out.println(“appalertList:+alerts.getComponentAt(0));}当我尝试使用System.out.println(“appalertList:+alerts.getHeader())打印它时,它会给我一个输入:“appalertList:null appalertList:null”JSON数组中有两个项在您的第一段代码中,您有这个try{List alert..
,但是您对新声明的alert
列表完全不做任何操作。数据应该来自哪里?除此之外,我们还缺少太多的片段来帮助您调试。请花些时间编辑您的文章
try {
List<Alert> alert = mapper.readValue...
try {
alerts = mapper.readValue
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());
}
}