【问题标题】:Java add function to json object without using quotes.Java 在不使用引号的情况下向 json 对象添加函数。
【发布时间】:2012-06-06 22:04:47
【问题描述】:

我正在用 java 构建一个 json 对象。我需要将一个函数传递给我的 javascript 并使用 jquery $.isFunction() 对其进行验证。我遇到的问题是我必须将 json 对象中的函数设置为字符串,但是 json 对象将周围的引号与对象一起传递,导致函数无效。如何在脚本中不出现引号的情况下执行此操作。

Java 示例

JSONObject json = new JSONObject();
json.put("onAdd", "function () {alert(\"Deleted\");}");

jQuery 脚本

//onAdd output is "function () {alert(\"Deleted\");}" 
//needs to be //Output is function () {alert(\"Deleted\");} 
//in order for it to be a valid function.
if($.isFunction(onAdd)) { 
    callback.call(hidden_input,item);
}

有什么想法吗?

【问题讨论】:

    标签: java javascript jquery json


    【解决方案1】:

    您可以实现 JSONString 接口。

    import org.json.JSONString;
    
    public class JSONFunction implements JSONString {
    
        private String string;
    
        public JSONFunction(String string) {
            this.string = string;
        }
    
        @Override
        public String toJSONString() {
            return string;
        }
    
    }
    

    然后,使用您的示例:

    JSONObject json = new JSONObject();
    json.put("onAdd", new JSONFunction("function () {alert(\"Deleted\");}"));
    

    输出将是:

    {"onAdd":function () {alert("Deleted");}}
    

    如前所述,它是无效的 JSON,但可能适合您的需要。

    【讨论】:

      【解决方案2】:

      你不能。 JSON 格式不包含函数数据类型。如果您想通过 JSON 传递函数,则必须将函数序列化为字符串。

      【讨论】:

      • 你能举个例子吗?
      • 你所拥有的就是一个例子。
      • 如何将其转换回脚本中的函数?
      • 从 json 对象中检索字符串并在字符串上使用 eval()?
      • 这似乎是诀窍,我只是担心它在某些浏览器中不起作用。我只是将函数名传递给 json 对象,希望 bug 少一些。
      【解决方案3】:

      跑步

      onAdd = eval(onAdd);
      

      应该把你的字符串变成一个函数,但是在某些浏览器中它是错误的。

      IE中的解决方法是使用

      onAdd = eval("[" + onAdd + "]")[0];
      

      Are eval() and new Function() the same thing?

      【讨论】:

      • hmm 所以没有什么稳定的,只是删除开始和结束引号呢?
      • @George,如果删除引号,则不是 JSON。但是,如果您使用 JSON 对象在 Java 中呈现 HTML,您可以只使用 out.println(json.get("onAdd")) 并且它会在不带引号的情况下打印
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-26
      • 1970-01-01
      • 2015-03-06
      • 2012-08-21
      相关资源
      最近更新 更多