如何将JSON转换为Java对象,反之亦然 [英] How To Convert JSON to Java object, and vise-versa

查看:188
本文介绍了如何将JSON转换为Java对象,反之亦然的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想填充我的FullCalendar,我在webview上绘制了数据/事件日期存储在数据库中。



我知道我会必须通过JSON来做到这一点。问题是几乎所有在线的文档都只停留在如何将JSON转换为Java对象,反之亦然。如何使转换的JSON / Java对象在HTML / Java类中可见?



例如,假设我有从数据库中检索的事件/约会对象列表。

 列表< FullCalendarData> events = new ArrayList(); 

FullCalendarData POJO类:

  @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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆