在Spring MVC和Jackson中,我有一个非常大的Java对象,我解析为JSON字符串myBigJSONString
(~1MB)并将其内联到我的HTML中。
然后在我的Javascript中我做了JSON.parse(myBigJSONString)
,一切都很有效。
但是,如果我将一个语法正确的Javascript对象内联到我的HTML而不是它的字符串表示,我的Javascript就不必读取这个巨大的字符串并解析它。它已经被解析了。
问题:如何从Java对象创建Javascript对象并直接内联它而不通过JSON字符串?
编辑:
这就是我现在看完HTML的方式:
var staticDataString = '[{\"propertyA\":\"valueA\"}, {\"propertyB\":\"valueB\"}]';
var staticData = JSON.parse(staticDataString);
这就是我希望它看起来的方式
var staticData = [{propertyA:"valueA"}, {propertyB:"valueB"}];
答案 0 :(得分:1)
在所有当前的浏览器中,这应该有效:
<script>
var obj = <c:out value="${$myserlvetmapping.myjson}"></c:out>;
alert(obj.test);
</script>
这是Spring-Handler:
model.addAttribute("myjson","{test:2}");
最后这将是浏览器源代码:
var obj = {test:2};
alert(obj.test);
alert
报告2
。
关于JSON的创建我建议使用&#34; adapter-pattern&#34;,这意味着很多手写代码。
为什么需要手写适配器?假设你在java中有横向引用的对象,如:
class Man {
Wife wife;
}
class Wife {
Man man;
}
Man joe = new Man();
Wife ann = new Wife();
joe.wife = ann;
ann.man = joe;
你的json将是
{man:{
name:'joe',
wife: {
name: 'ann',
man: {
name: 'joe',
wife: {
name: 'ann',
man: {
name: 'joe',
wife: {
.....
}
}
}
}
}
}}
要防止递归,您只能使用Adapter-Pattern。这可行:
public final class ManJSONAdapter {
private final Man man;
public ManJSONAdapter(Man man){
this.man = man;
}
public String toJSON(){
String result="{";
if (man != null) {
result += "name:";
if (man.name == null){
result += "undefined"
} else {
result += "'" + StringEscapeUtils.ESCAPE_ECMASCRIPT.translate(man.name) +"'";
}
result += ",wife:";
if (man.wife == null) {
result += "undefined";
} else {
...
}
}
result += "}";
return result;
}
}