2013-12-17 96 views
1

我們必須解析類似於下面的json結構。遞歸結構的json解析器

project { 
    header { 
    } 
    pool { 
    } 
    cmp { 
     name = ""; 
     id = ""; 
     desc = ""; 
     cmp [ 
     { 
      name = ""; 
      id = ""; 
      desc = ""; 
     } 
     { 
      name = ""; 
      id = ""; 
      desc = ""; 
     } 
     { 
      name = ""; 
      id = ""; 
      desc = ""; 
      cmp [ 
      { 
      name = ""; 
      id = ""; 
      desc = "";   
      } 
     }  
    } 
} 

問題是,cmp元素是存在於json無限(也是遞歸)。 cmp元素包含除name,id和desc以外的大量屬性。但是我們只需要name,id和desc來從jSON中提取。

我可以使用com.json.parsers.JSONParser來解析JSON字符串。但是將解析的JSON填充到模型類/ bean類中不起作用。這可能是一個簡單的邏輯。但是我不能。請幫助...

json文件生成爲一個建模軟件的輸出。

我想解析這個,使用java。有人可以幫我解析這個嗎?

希望我已經正確地解釋了這個問題。你的幫助對我們有幫助。

+0

你就得到了作爲正確地分析第一級? – jonhopkins

+0

是的。我正在使用com.json.parsers.JSONParser來解析JSON字符串。我的僵局是,cmd的遞歸併從cmd中只提取了幾個屬性。 – user867662

+0

你知道你的例子不是JSON嗎?假設你實際上有json,你看過JSON庫,比如Jackson和GSON嗎?你還試過了什麼? – Charlie

回答

1

看看Google Gson庫。有了它,你可以做這樣的事情:

class BagOfPrimitives { 
    private int value1 = 1; 
    private String value2 = "abc"; 
    private transient int value3 = 3; 
    BagOfPrimitives() { 
    // no-args constructor 
    } 
} 

//(Serialization) 
BagOfPrimitives obj = new BagOfPrimitives(); 
Gson gson = new Gson(); 
String json = gson.toJson(obj); 
//==> json is {"value1":1,"value2":"abc"} 


//(Deserialization) 
BagOfPrimitives obj2 = gson.fromJson(json, BagOfPrimitives.class); 
//==> obj2 is just like obj 
+0

但是對於使用Gson,我們需要創建帶有JSON結構中所有屬性的模型類BagOfPrimitives?在我的JSON中,有些時候,某些元素可能不存在於cmd中。 – user867662

+1

這不是問題。假設你有: 'class BagOfPrimitives {private int value1; private String value2; private int value3; BagOfPrimitives(){// 無參數的構造函數 } }' 和您的JSON是:'{ 「值1」:1}'。您仍然可以將您的對象反序列化到您的類中,只是缺少的值將設置爲默認值(int:0,String:null) –

2

可以與傑克遜做到這一點,只是可能會或可能不會出現在消息中的所有字段創建對象。消息中不存在的所有字段在結果對象中將以空值(或基元的默認值)結束。

只要有對象包含自身的拷貝,並且將處理遞歸

@XmlRootElement 
public class Foo { 
    Foo recursiveFoo; // will be null or another instance of Foo 
    int intData; // Will be 0 or an integer value 
    String strData; // Will be null or a String value 

    // Getters and setters here 
}