我使用Dropbox API,我想从json对象获取文件夹和路径。但是我遇到了问题,因为有一些子节点被破坏了。我怎么去解析这样的东西?
修改
JSONObject代表一个目录。顶级文件夹由json对象表示。在该对象中是子文件夹。他们每个都有JSONobject,在每个jsonobject中都有一个数组代表子文件夹的子文件夹。所以我不知道json的完整结构
答案 0 :(得分:2)
我刚刚遇到了同样的问题,我写了一个带有递归算法的类,经过搜索并搜索特定的ID ..似乎工作正常,请随意尝试一下!
import java.util.ArrayList;
import java.util.List;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
public class JsonReference {
Object data;
public JsonReference(String buildFromString){
try {
data = new JSONObject(buildFromString);
} catch (JSONException e) {
e.printStackTrace();
}
if(data == null){
try {
data = new JSONArray(buildFromString);
} catch (JSONException e) {
e.printStackTrace();
}
}
}
public Object getAbstractJsonObject(){
return data;
}
public List<String> parseForData(String data,boolean removeDuplicates){
Traverser valFinder = new Traverser(0);
valFinder.setValues(data, removeDuplicates);
valFinder.traverseForStringValue(this.data);
return valFinder.foundInstances;
}
class Traverser{
List<String> foundInstances = new ArrayList<String>();
String value;
boolean removeDuplicates;
public Traverser(int type){
}
public void setValues(String value,boolean removeDuplicates){
this.value = value;
this.removeDuplicates = removeDuplicates;
}
public void traverseForStringValue(Object root){
if(root == null){
return;
}
else if(root instanceof JSONObject){
JSONObject self = (JSONObject)root;
//if the key exists in this object.. save it!
if(self.has(value)){
try {
if(!removeDuplicates || notRepeat(self.getString(value)))
foundInstances.add(self.getString(value));
} catch (JSONException e) {
e.printStackTrace();
}
return;
}
//otherwise, see if you can dive deeper..
JSONArray names = self.names();
for(int i=0;i<names.length();i++){
String temp = null;
try{
temp = names.getString(i);
}
catch(JSONException e){
e.printStackTrace();
}
if(temp != null){
try {
if(self.get(temp) instanceof JSONObject || self.get(temp) instanceof JSONArray)
traverseForStringValue(self.get(temp));
else if(self.get(temp) instanceof String){
if(!removeDuplicates || notRepeat(self.getString(value)))
foundInstances.add(self.getString(value));
}
} catch (JSONException e) {
e.printStackTrace();
}
}
}
}
else if(root instanceof JSONArray){
JSONArray self = (JSONArray)root;
//iterate through the array..
for(int i=0;i<self.length();i++){
Object temp = null;
try {
temp = self.get(i);
} catch (JSONException e) {
e.printStackTrace();
}
if(temp != null && temp != JSONObject.NULL){
if(temp instanceof JSONObject || temp instanceof JSONArray)
traverseForStringValue(temp);
else if(temp instanceof String && ((String)temp).contains(value)){
try {
if(!removeDuplicates || notRepeat(self.getString(i)))
foundInstances.add(self.getString(i));
} catch (JSONException e) {
e.printStackTrace();
}
}
}
}
}
}
private boolean notRepeat(String s){
for(String item : foundInstances){
if(item.equals(s))
return false;
}
return true;
}
}
}
答案 1 :(得分:1)
得到了https://stackoverflow.com/a/10593838/259889
的回复JSONObject jObject = new JSONObject(contents.trim());
Iterator<?> keys = jObject.keys();
while( keys.hasNext() ){
String key = (String)keys.next();
if( jObject.get(key) instanceof JSONObject ){
// do your stuff
}
}
答案 2 :(得分:0)
对于包含节点的JsonObject
,您可以执行此操作:
JsonObject jsonO = //get your JsonObject
List<String> keys = jsonO.keys();
List<Object> nodes = new ArrayList<Object>
for(String k: keys){
nodes.add(jsonO.get(k));
}
如果是JsonArray
JSONArray jsonA = //get Your JsonArray
List<Object> nodes = new ArrayList<Object>
for (int i = 0; i < jsonA.length(); i++){
nodes.add(jsonA.get(i));
}
或考虑使用GSON
答案 3 :(得分:-2)
这可能是你想要转换它的JSONArray。如果你没有根据JSONObject中的id来提取值,那么它就是JSONArray。你可以这样做:
for (int i = 0; i < jsonArray.length(); i++) {
whateverTheObjectIs = jsonArray.getObject(i);
}