Java将JSON多维对象元素解析为String

时间:2016-09-19 08:10:59

标签: java arrays json

我有JSONObject数据,里面有多个对象。 我想要做的是,将json变为简单的层次结构。

JSON数据

{
    "Response": {
        "type": "string",
        "content": "0000"
    },
    "Data": {
        "item": [
            {
                "firstname": {
                    "type": "string",
                    "content": "Bryan"
                },
                "lastname": {
                    "type": "string",
                    "content": "Adams"
                },
                "kids": {
                    "item": [
                        {
                            "name": {
                                "type": "string",
                                "content": "Tommy"
                            },
                            "age": {
                                "type": "string",
                                "content": "9"
                            }
                        },
                        {
                            "name": {
                                "type": "string",
                                "content": "Jane"
                            },
                            "age": {
                                "type": "string",
                                "content": "4"
                            }
                        }
                    ]
                }
            },
            {
                "firstname": {
                    "type": "string",
                    "content": "Joey"
                },
                "lastname": {
                    "type": "string",
                    "content": "Cena"
                },
                "kids": {
                    "item": [
                        {
                            "name": {
                                "type": "string",
                                "content": "Maria"
                            },
                            "age": {
                                "type": "string",
                                "content": "7"
                            }
                        },
                        {
                            "name": {
                                "type": "string",
                                "content": "Dany"
                            },
                            "age": {
                                "type": "string",
                                "content": "3"
                            }
                        }
                    ]
                }
            }
        ]
    }
}

我的代码

package junk;

import java.util.Iterator;
import org.json.JSONException;
import org.json.JSONObject;

/**
 *
 * @author Agung
 */
class Foo {

    private static JSONObject objResponse = new JSONObject();

    public static void main(String args[]) throws JSONException {
        JSONObject jsonObj = new JSONObject("{\"Response\":{\"type\":\"string\",\"content\":\"0000\"},\"Data\":{\"item\":[{\"firstname\":{\"type\":\"string\",\"content\":\"Bryan\"},\"lastname\":{\"type\":\"string\",\"content\":\"Adams\"},\"kids\":{\"item\":[{\"name\":{\"type\":\"string\",\"content\":\"Tommy\"},\"age\":{\"type\":\"string\",\"content\":\"9\"}},{\"name\":{\"type\":\"string\",\"content\":\"Jane\"},\"age\":{\"type\":\"string\",\"content\":\"4\"}}]}},{\"firstname\":{\"type\":\"string\",\"content\":\"Joey\"},\"lastname\":{\"type\":\"string\",\"content\":\"Cena\"},\"kids\":{\"item\":[{\"name\":{\"type\":\"string\",\"content\":\"Maria\"},\"age\":{\"type\":\"string\",\"content\":\"7\"}},{\"name\":{\"type\":\"string\",\"content\":\"Dany\"},\"age\":{\"type\":\"string\",\"content\":\"3\"}}]}}]}}");
        Foo.getResponseContent(jsonObj);
        System.out.println(objResponse);
    }

    private static void getResponseContent(JSONObject jsonObj) throws JSONException {
        Iterator<?> keys = jsonObj.keys();
        while (keys.hasNext()) {
            String key = (String) keys.next();
            if (jsonObj.get(key) instanceof JSONObject) {
                JSONObject object = jsonObj.getJSONObject(key);
                if (object.has("content")) {
                    String content = (String) object.get("content");
                    objResponse.put(key, content);
                } else {
                    // if we get here, so the element have multiple node
                    objResponse.put(key, object);
                    getResponseContent(object);
                }
            }
        }
    }
}

使用我的代码,我得到了这个结果:

{
    "Response": "0000",
    "Data": {
        "item": [
            {
                "firstname": {
                    "type": "string",
                    "content": "Bryan"
                },
                "lastname": {
                    "type": "string",
                    "content": "Adams"
                },
                "kids": {
                    "item": [
                        {
                            "name": {
                                "type": "string",
                                "content": "Tommy"
                            },
                            "age": {
                                "type": "int",
                                "content": "9"
                            }
                        },
                        {
                            "name": {
                                "type": "string",
                                "content": "Jane"
                            },
                            "age": {
                                "type": "int",
                                "content": "4"
                            }
                        }
                    ]
                }
            },
            {
                "firstname": {
                    "type": "string",
                    "content": "Joey"
                },
                "lastname": {
                    "type": "string",
                    "content": "Cena"
                },
                "kids": {
                    "item": [
                        {
                            "name": {
                                "type": "string",
                                "content": "Maria"
                            },
                            "age": {
                                "type": "int",
                                "content": "7"
                            }
                        },
                        {
                            "name": {
                                "type": "string",
                                "content": "Dany"
                            },
                            "age": {
                                "type": "int",
                                "content": "3"
                            }
                        }
                    ]
                }
            }
        ]
    }
}

仅适用于没有多个元素的字段。 但我想要的结果是:

{
    "Response": "0000",
    "Data": {
        "item": [
            {
                "firstname": "Bryan",
                "lastname": "Adams",
                "kids": {
                    "item": [
                        {
                            "name": "Tommy",
                            "age": 9
                        },
                        {
                            "name": "Jane",
                            "age": 4
                        }
                    ]
                }
            },
            {
                "firstname": "Joey",
                "lastname": "Cena",
                "kids": {
                    "item": [
                        {
                            "name": "Maria",
                            "age": 7
                        },
                        {
                            "name": "Dany",
                            "age": 3
                        }
                    ]
                }
            }
        ]
    }
}

我不知道如何从数据字段中删除对象。

1 个答案:

答案 0 :(得分:0)

这是一个以你想要的格式创建输出的程序:像你一样,我使用过递归,我做的改变是:

  • 我处理了数组
  • 我创建了一个新对象来收集没有'content'键的孩子的数据。

以下是代码:

package test;

import java.util.Iterator;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

public class TestMain {

    public static void main(String args[]) throws Exception {
        JSONObject objResponse = new JSONObject();
        JSONObject jsonObj = new JSONObject(
                "{\"Response\":{\"type\":\"string\",\"content\":\"0000\"},\"Data\":{\"item\":[{\"firstname\":{\"type\":\"string\",\"content\":\"Bryan\"},\"lastname\":{\"type\":\"string\",\"content\":\"Adams\"},\"kids\":{\"item\":[{\"name\":{\"type\":\"string\",\"content\":\"Tommy\"},\"age\":{\"type\":\"string\",\"content\":\"9\"}},{\"name\":{\"type\":\"string\",\"content\":\"Jane\"},\"age\":{\"type\":\"string\",\"content\":\"4\"}}]}},{\"firstname\":{\"type\":\"string\",\"content\":\"Joey\"},\"lastname\":{\"type\":\"string\",\"content\":\"Cena\"},\"kids\":{\"item\":[{\"name\":{\"type\":\"string\",\"content\":\"Maria\"},\"age\":{\"type\":\"string\",\"content\":\"7\"}},{\"name\":{\"type\":\"string\",\"content\":\"Dany\"},\"age\":{\"type\":\"string\",\"content\":\"3\"}}]}}]}}");
        getResponseContent(jsonObj, objResponse);
        System.out.println(objResponse.toString(2));
    }

    private static void getResponseContent(JSONObject jsonObj, JSONObject objResponse) throws JSONException {

        Iterator<?> keys = jsonObj.keys();
        while (keys.hasNext()) {
            String key = (String) keys.next();
            JSONObject child = jsonObj.optJSONObject(key);
            if (child != null) {
                if (child.has("content")) {
                    objResponse.put(key, child.get("content"));
                } else {
                    JSONObject responseChild = new JSONObject();
                    objResponse.put(key, responseChild);
                    getResponseContent(child, responseChild);
                }
            } else {
                JSONArray children = jsonObj.optJSONArray(key);
                if (children != null) {
                    JSONArray responseChildren = new JSONArray();
                    objResponse.put(key, responseChildren);
                    for (int i = 0; i < children.length(); i++) {
                        child = children.getJSONObject(i);
                        JSONObject responseChild = new JSONObject();
                        responseChildren.put(responseChild);
                        getResponseContent(child, responseChild);
                    }
                }
            }
        }

    }
}

这是它的输出:

{
  "Response": "0000",
  "Data": {"item": [
    {
      "firstname": "Bryan",
      "lastname": "Adams",
      "kids": {"item": [
        {
          "name": "Tommy",
          "age": "9"
        },
        {
          "name": "Jane",
          "age": "4"
        }
      ]}
    },
    {
      "firstname": "Joey",
      "lastname": "Cena",
      "kids": {"item": [
        {
          "name": "Maria",
          "age": "7"
        },
        {
          "name": "Dany",
          "age": "3"
        }
      ]}
    }
  ]}
}