将Java对象解析为Javascript

时间:2015-11-16 11:36:09

标签: javascript java json spring-mvc jackson

在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"}];

1 个答案:

答案 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;
  }
}