我使用 Dropbox API,我想从 json 对象中获取文件夹和路径。但是我遇到了问题,因为子节点的数量减少了。我将如何解析这样的东西?
编辑
JSONObject 代表一个目录。顶级文件夹由 json 对象表示。该对象内是子文件夹。他们每个人都有JSONobject,在每个jsonobject中都有一个数组,代表子文件夹的子文件夹。所以不知道json的完整结构
我刚刚遇到了同样的问题,我编写了一个带有递归算法的类,该算法通过并搜索特定的 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;
}
}
}
从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
}
}
对于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
它可能是您想要将其转换为的 JSONArray。如果您不是在 JSONObject 中根据它们的 id 提取值,那么它就是一个 JSONArray。你可以这样做:
for (int i = 0; i < jsonArray.length(); i++) {
whateverTheObjectIs = jsonArray.getObject(i);
}