【问题标题】:How to Create following String Dynamically如何动态创建以下字符串
【发布时间】:2012-07-27 08:04:18
【问题描述】:

我在这里使用 Lucen 库做项目,我需要使用 Json 对象动态构建查询。所以在这里我使用了 jettison 库。作为一个例子,我的 json 像这样

{"OR":{"OR": {"fildKey1": "value1","fildKey2": "value2","fildKeyabc": "valueabc"},"AND": {"AND": {"fildKey3": "value3","OR": {"fildKey4": "value4","fildKey5": "value5"}},"fildKeyw": "valuew"}}}

使用上面的 json 我需要创建以下查询

(( fildKey1 : value1 OR fildKey2 : value2 OR fildKeyabc : valueabc )OR(( fildKey3 : value3 AND( fildKey4 : value4 OR fildKey5 : value5 ))AND fildKeyw : valuew ))

但我无法得到上面的查询。我的结果是这样的

(( fildKey1 : value1 OR fildKey2 : value2 OR fildKeyabc : valueabc )OR(( fildKey3 : value3 AND( fildKey4 : value4 OR fildKey5 : value5 )AND)AND fildKeyw : valuew )OR)

我需要删除上面额外的 2 个运算符,这是我的代码

public class JettisionCls {
   static Stack s = new Stack();
   String operater = null;
   static String res = "";
   int bracket_counter = 0;   


public void getKeyAndValue(JSONObject json_obj) throws JSONException{
    Iterator<String> iter = json_obj.keys();

    while (iter.hasNext()) {
        String obj = iter.next();
        if(obj.toLowerCase().equals("and") || obj.toLowerCase().equals("or")){
            //System.out.print(obj);
            operater = obj;              
        }

        JSONObject temp = null;
        try {
            temp = new JSONObject(json_obj.get(obj).toString());
        } catch (JSONException e) {
            e.getStackTrace();
        }

        if (temp != null) {
            //System.out.print("(");
            res = res +"(";
            bracket_counter=bracket_counter+1;
            s.push(operater);

            getKeyAndValue(temp);

            //System.out.print(")");
            res = res +")";
            bracket_counter=bracket_counter-1;                          
            if((s.size()) != 0 && bracket_counter != 0){
                //System.out.print(s.peek());
                s.pop();
                res = res +s.peek(); 
            }
            else{
                s.pop();
            }
        }            
        else{
            if(iter.hasNext()){
                res = res+" "+obj + " : " + json_obj.get(obj) + " " + operater;                                    }
            else{
                res = res+" "+obj + " : " + json_obj.get(obj)+" ";
            }
        }
    }
}

我的主要方法是这样的

String multiLevelQuery = "{\"OR\":{\"OR\": {\"fildKey1\": \"value1\",\"fildKey2\": \"value2\",\"fildKeyabc\": \"valueabc\"},\"AND\": {\"AND\": {\"fildKey3\": \"value3\",\"OR\": {\"fildKey4\": \"value4\",\"fildKey5\": \"value5\"}},\"fildKeyw\": \"valuew\"}}}";

JSONObject jobj = new JSONObject(multiLevelQuery);
JettisionCls obj = new JettisionCls();
obj.getKeyAndValue(jobj);
System.out.println(JettisionCls.res);

如果有人可以帮助我。

【问题讨论】:

  • @Afrin 这个也适用于简单的查询。我也在这里看不到任何错误。如果有请解释更多。

标签: java json recursion


【解决方案1】:

我认为您可以使用字符串替换来做到这一点。

public void createQry(String s){
    String temp = s;

    if(temp.contains(")OR)")){
        temp = temp.replace(")OR)", "))");
    }
    if(s.contains(")AND)")){
        temp = temp.replace(")AND)", "))");
    }
    System.out.println(temp);        
}

【讨论】:

    【解决方案2】:

    嗯,这是一个有趣的问题。但不是蛮力,我会选择更优雅的东西,比如recursion。推送、弹出和连接将通过递归为您完成。在您的代码中,我可以看到很多地方可以破坏。即使您解决了这个问题,它也有可能因其他情况而失败。

    具有递归的示例算法是

    public String generateQuery(JSONObject json_obj) {
    
    if(single_json_obj)
       return generated_query_for_single_condition;
    
    //else complex json with inner children
    else
       return generateQuery(innerJSONObject)
    }
    

    }

    【讨论】:

    • @Afrin 他已经使用了递归,但是还不足以得到预期的结果
    猜你喜欢
    • 2017-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-16
    相关资源
    最近更新 更多