如何将JSON转换为Java对象,反之亦然 [英] How To Convert JSON to Java object, and vise-versa
问题描述
我想填充我的FullCalendar,我在webview上绘制了数据/事件日期存储在数据库中。
我知道我会必须通过JSON来做到这一点。问题是几乎所有在线的文档都只停留在如何将JSON转换为Java对象,反之亦然。如何使转换的JSON / Java对象在HTML / Java类中可见?
例如,假设我有从数据库中检索的事件/约会对象列表。
列表< FullCalendarData> events = new ArrayList();
@Component
@Entity
@Table(name =ENTITY_OBJECT)
@Scope(proxyMode = scopedProxyMode.TARGET_CLASS,value =prototype)
@Inheritance(strategy = InheritanceType.JOINED)
public class FullCalendarData {
private String eventName;
private String startTime;
private String endTime;
public String getEventName(){
return eventName;
}
public void setEventName(String eventName){
this.eventName = eventName;
}
public String getStartTime(){
return startTime;
}
public void setStartTime(String startTime){
this.startTime = startTime;
}
public String getEndTime(){
return endTime;
}
public void setEndTime(String endTime){
this.endTime = endTime;
}
}
转换列表与LT; FullCalendarData>事件
从Java到JSON:
Gson gson = new Gson();
String jsonAppointment = gson.toJson(events);
现在问题是,我该如何制作 jsonAppointment
在下面的HTML \ webview中的FullCalendar中可见,或换句话说,我如何访问和遍历 jsonAppointment
并使用它( jsonAppointment
)而不是下面的 events
数组<$ p
$ b
<!DOCTYPE html>
< html>
< head>
< link href ='.. / fullcalendar / fullcalendar.css'rel ='stylesheet'/>
< link href ='.. / fullcalendar / fullcalendar.print.css'rel ='stylesheet'media ='print'/>
< script src ='.. / lib / jquery.min.js'>< / script>
< script src ='.. / lib / jquery-ui.custom.min.js'>< / script>
< script src ='.. / fullcalendar / fullcalendar.min.js'>< / script>
< script>
$(document).ready(function(){
var date = new Date();
var d = date.getDate();
var m = date.getMonth();
var y = date.getFullYear();
$ b $('#calendar')。fullCalendar({
editable:true ,
events:[
{
title:'All Day Event',
start:new Date(y,m,1)
},
{
id:999,
title:'Repeating Event',
start:new Date(y,m,d + 4,16,0),
allDay:false
}
]
});
});
< / script>
< / head>
< body>
< div id ='calendar'>< / div>
< / body>
< / html>
调用我们的webview:
public class FullCalendarWebView {
public VBox calendar(){
final WebView webView = new WebView();
final WebEngine engine = webView.getEngine();
engine.load(file:D:/standAloneDev//src/fc/fullcalendarwebview/fullcalendar-1.6.4/demos/selectable.html);
JSObject脚本=(JSObject)engine.executeScript(window);
script.setMember(eventClick,new JavaApp()。javaApp());
VBox vb = new VBox();
vb.getChildren()。add(webView);
return vb;
}
}
将单个事件发送到日历
为了将一些事件从JavaFX发送到日历,首先应创建一个在日历上生成单一事件的JavaScript函数:
private WebView webView;
私有WebEngine引擎;
private void createCalendar(){
webView = new WebView();
engine = webView.getEngine();
engine.load(file:D:/standAloneDev//src/fc/fullcalendarwebview/fullcalendar-1.6.4/demos/selectable.html);
engine.getLoadWorker()。stateProperty()。addListener((ov,oldState,newState) - > {
if(newState == State.SUCCEEDED){
// JS到Java
JSObject脚本=(JSObject)engine.executeScript(window);
script.setMember(myClick,new JavaApp());
// Java到JS,创建单个事件的函数
engine.executeScript(function addEvent(title,start,end){\ n+
var eventData = {\ n +
title:title,\\\
+
start:start,\\\
+
end:end \\\
+
}; \\\
+
$('#calendar')。fullCalendar('renderEvent',eventData,true); \\\
+
});
}
});
$ b现在我们可以在JavaFX应用程序上测试这个函数,数据:
@Override
public void start(Stage primaryStage){
Button btn =新的按钮(添加事件);
btn.setOnAction(e-> {
FullCalendarData data1 = new FullCalendarData();
data1.setEventName(Event 1);
data1.setStartTime(2015- ;
data1.setEndTime(2015-01-11T18:00:00);
engine.executeScript(addEvent('+ data1.getEventName() +
','+ data1.getStartTime()+
','+ data1.getEndTime()+'););
}) ;
createCalendar();
场景场景=新场景(新VBox(webView,btn),600,400);
primaryStage.setScene(scene);
primaryStage.show();
发送日历列表
如果要使用JSON格式发送事件列表,可以创建另一个函数来处理列表并调用 addEvent()
列表中的每个元素:
$ b $ pre $ engine.getLoadWorker()。stateProperty()。addListener((ov, oldState,newState) - > {
if(newState == State.SUCCEEDED){
...
// Java to JS,发送JSON列表
engine.executeScript function addListEvents(result){\ n+
for(var i = 0; i< result.data.length; i ++){\ n+
addEvent(result.data [i] .eventName,result.data [i] .startTime,result.data [i] .endTime); \\\
+
}; \\\
+
}) ;
}
});
使用事件列表的包装器:
class CalendarEvents {
final List< FullCalendarData> data = new ArrayList<>();
公开列表< FullCalendarData> getData(){
返回数据;
}
public void addEvent(FullCalendarData event){
this.data.add(event);
}
}
我们可以检索事件列表,将其转换为JSON格式并调用此脚本:
@Override
public void start(Stage primaryStage){
按钮btn =新建按钮(添加事件);
btn.setOnAction(e-> {
//随机事件列表
FullCalendarData data1 = new FullCalendarData();
data1.setEventName(Event 1 );
data1.setStartTime(2015-01-11T16:00:00);
data1.setEndTime(2015-01-11T18:00:00);
FullCalendarData data2 = new FullCalendarData();
data2.setEventName(Event 2);
data2.setStartTime(2015-01-12T15:00:00);
data2.setEndTime(2015-01-12T18:00:00);
FullCalendarData data3 = new FullCalendarData();
data3.setEventName(Event 3);
data3.setStartTime(2015-01-13T15:00:00);
data3.setEndTime(2015-01-1316:00:00);
CalendarEvents cal = new CalendarEvents();
cal.addEvent(data1);
cal.addEvent(data2);
cal.addEvent(data3);
Gson gson = new Gson();
字符串json = gson.toJson(cal,CalendarEvents.class);
engine.executeScript(addListEvents(+ json +););
});
createCalendar();
场景场景=新场景(新VBox(webView,btn),600,400);
primaryStage.setScene(scene);
primaryStage.show();
}
您将在日历上看到您的活动:
I would like to populate my FullCalendar, which I have drawn on a webview, with data/ event dates stored in a database.
I know that I'll have to do this via JSON. The problem is that practically all documentation I've come accross online only stop at "How To Convert JSON to Java object", and vise-versa. How about making the converted JSON/ Java object visible in the HTML/ Java class?
For example, say I have a List of event/ appointment objects retrieved from a database.
List<FullCalendarData> events = new ArrayList();
The FullCalendarData
POJO class:
@Component
@Entity
@Table(name = "ENTITY_OBJECT")
@Scope(proxyMode = ScopedProxyMode.TARGET_CLASS, value = "prototype")
@Inheritance(strategy = InheritanceType.JOINED)
public class FullCalendarData {
private String eventName;
private String startTime;
private String endTime;
public String getEventName() {
return eventName;
}
public void setEventName(String eventName) {
this.eventName = eventName;
}
public String getStartTime() {
return startTime;
}
public void setStartTime(String startTime) {
this.startTime = startTime;
}
public String getEndTime() {
return endTime;
}
public void setEndTime(String endTime) {
this.endTime = endTime;
}
}
Convert List<FullCalendarData> events
from Java to JSON:
Gson gson = new Gson();
String jsonAppointment = gson.toJson(events);
Now the problem is, how do I make jsonAppointment
visible in a the FullCalendar in the HTML\ webview below, or in other words, how do I access and iterate over jsonAppointment
and use it (jsonAppointment
) instead of the events
array below?
<!DOCTYPE html>
<html>
<head>
<link href='../fullcalendar/fullcalendar.css' rel='stylesheet' />
<link href='../fullcalendar/fullcalendar.print.css' rel='stylesheet' media='print' />
<script src='../lib/jquery.min.js'></script>
<script src='../lib/jquery-ui.custom.min.js'></script>
<script src='../fullcalendar/fullcalendar.min.js'></script>
<script>
$(document).ready(function() {
var date = new Date();
var d = date.getDate();
var m = date.getMonth();
var y = date.getFullYear();
$('#calendar').fullCalendar({
editable: true,
events: [
{
title: 'All Day Event',
start: new Date(y, m, 1)
},
{
id: 999,
title: 'Repeating Event',
start: new Date(y, m, d + 4, 16, 0),
allDay: false
}
]
});
});
</script>
</head>
<body>
<div id='calendar'></div>
</body>
</html>
Call our webview:
public class FullCalendarWebView {
public VBox calendar() {
final WebView webView = new WebView();
final WebEngine engine = webView.getEngine();
engine.load("file:D:/standAloneDev//src/fc/fullcalendarwebview/fullcalendar-1.6.4/demos/selectable.html");
JSObject script = (JSObject) engine.executeScript("window");
script.setMember("eventClick", new JavaApp().javaApp());
VBox vb = new VBox();
vb.getChildren().add(webView);
return vb;
}
}
Sending a single event to the calendar
In order to send some events to the calendar from JavaFX, first of all you should create a JavaScript function that generates one single event on the calendar:
private WebView webView;
private WebEngine engine;
private void createCalendar() {
webView = new WebView();
engine = webView.getEngine();
engine.load("file:D:/standAloneDev//src/fc/fullcalendarwebview/fullcalendar-1.6.4/demos/selectable.html");
engine.getLoadWorker().stateProperty().addListener((ov,oldState, newState)->{
if(newState==State.SUCCEEDED){
// JS to Java
JSObject script = (JSObject) engine.executeScript("window");
script.setMember("myClick", new JavaApp());
// Java to JS, function to create single event
engine.executeScript("function addEvent(title, start, end) {\n" +
"var eventData = {\n" +
" title: title,\n" +
" start: start,\n" +
" end: end\n" +
"};\n" +
"$('#calendar').fullCalendar('renderEvent', eventData, true);\n" +
"}");
}
});
}
Now we can test this function on the JavaFX application, calling the script with some data:
@Override
public void start(Stage primaryStage) {
Button btn=new Button("Add Event");
btn.setOnAction(e->{
FullCalendarData data1=new FullCalendarData();
data1.setEventName("Event 1");
data1.setStartTime("2015-01-11T16:00:00");
data1.setEndTime("2015-01-11T18:00:00");
engine.executeScript("addEvent('"+data1.getEventName()+
"','"+data1.getStartTime()+
"','"+data1.getEndTime()+"');");
});
createCalendar();
Scene scene = new Scene(new VBox(webView,btn), 600, 400);
primaryStage.setScene(scene);
primaryStage.show();
}
Sending a list of events to the calendar
If you want to send a list of events using JSON format, you can create another function to process the list and call addEvent()
on each element on the list:
engine.getLoadWorker().stateProperty().addListener((ov,oldState, newState)->{
if(newState==State.SUCCEEDED){
...
// Java to JS, send JSON list
engine.executeScript("function addListEvents(result) {\n" +
"for(var i=0; i<result.data.length; i++){\n" +
" addEvent(result.data[i].eventName, result.data[i].startTime, result.data[i].endTime);\n" +
"};\n" +
"}");
}
});
Using a wrapper for the list of events:
class CalendarEvents{
final List<FullCalendarData> data=new ArrayList<>();
public List<FullCalendarData> getData() {
return data;
}
public void addEvent(FullCalendarData event) {
this.data.add(event);
}
}
we can retrieve a list of events, convert it to JSON format and call this script:
@Override
public void start(Stage primaryStage) {
Button btn=new Button("Add Events");
btn.setOnAction(e->{
// list of random events
FullCalendarData data1=new FullCalendarData();
data1.setEventName("Event 1");
data1.setStartTime("2015-01-11T16:00:00");
data1.setEndTime("2015-01-11T18:00:00");
FullCalendarData data2=new FullCalendarData();
data2.setEventName("Event 2");
data2.setStartTime("2015-01-12T15:00:00");
data2.setEndTime("2015-01-12T18:00:00");
FullCalendarData data3=new FullCalendarData();
data3.setEventName("Event 3");
data3.setStartTime("2015-01-13T15:00:00");
data3.setEndTime("2015-01-1316:00:00");
CalendarEvents cal = new CalendarEvents();
cal.addEvent(data1);
cal.addEvent(data2);
cal.addEvent(data3);
Gson gson=new Gson();
String json=gson.toJson(cal,CalendarEvents.class);
engine.executeScript("addListEvents("+json+");");
});
createCalendar();
Scene scene = new Scene(new VBox(webView,btn), 600, 400);
primaryStage.setScene(scene);
primaryStage.show();
}
You will have your events on the calendar:
这篇关于如何将JSON转换为Java对象,反之亦然的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!