我试图解析我从Android中的HttpURLConnection获取的这个JSON。
{
"responsejson":
{
"value1": [
{
"data": "Call",
"label": "Call",
"default": false
},
{
"data": "Email",
"label": "Email",
"default": false
}
],
"value2": [
{
"attributes": {
"type": "Status",
"url": "/..."
},
"IsOpened": false,
"IsDefault": true,
"TechLabel": "NotStarted",
"Id": "01Jb"
},
{
"attributes": {
"type": "Status",
"url": "/..."
},
"IsOpened": false,
"IsDefault": false,
"TechLabel": "InProgress",
"Id": "01Jb"
},
{
"attributes": {
"type": "Status",
"url": "/..."
},
"IsOpened": true,
"IsDefault": false,
"TechLabel": "Completed",
"Id": "01Jb"
}
],
...
}
}
我想要做的是将 value1 的内容保存在字符串中, value2 的内容保存在另一个字符串中,...因为我需要将它存储在数据库中,所以将来我可以加载并解析它。我正在使用JsonReader,但是使用JsonReader无法做到这一点。
// ...
inputStream = conn.getInputStream();
JsonReader json = new JsonReader(new InputStreamReader(in));
json.beginObject();
while (json.hasNext()) {
String valueName = json.nextName();
// String content = ?????
}
json.endObject();
// ...
有什么想法吗? 自定义对象不可能,因为我们永远不知道JSON将显示哪些值。
答案 0 :(得分:1)
使用此命令将JSON数组转换为字符串
private String convertStreamToString(InputStream is) {
/*
* To convert the InputStream to String we use the
* BufferedReader.readLine() method. We iterate until the
* BufferedReader return null which means there's no more data to
* read. Each line will appended to a StringBuilder and returned as
* String.
*/
BufferedReader reader = new BufferedReader(
new InputStreamReader(is));
StringBuilder sb = new StringBuilder();
String line = null;
try {
while ((line = reader.readLine()) != null) {
sb.append(line + "\n");
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return sb.toString();
}
答案 1 :(得分:0)
使用Gson解析您在InputStream中收到的JSON。然后,您可以从该解析对象中获取ArrayList。再次,使用Gson将arraylist序列化为JSON。
答案 2 :(得分:0)
此代码适用于您的示例json。
public class Value1 {
public String data,label;
@SerializedName("default")
public boolean isdefault;
}
public class Value2 {
public Attributes attributes;
public boolean IsOpened,IsDefault;
public String TechLabel,Id;
}
public class Attributes {
public String type,url;
}
String jsonString = "{\"responsejson\":{\"value1\":[{\"data\":\"Call\",\"label\":\"Call\",\"default\":false},{\"data\":\"Email\",\"label\":\"Email\",\"default\":false}],\"value2\":[{\"attributes\":{\"type\":\"Status\",\"url\":\"/...\"},\"IsOpened\":false,\"IsDefault\":true,\"TechLabel\":\"NotStarted\",\"Id\":\"01Jb\"},{\"attributes\":{\"type\":\"Status\",\"url\":\"/...\"},\"IsOpened\":false,\"IsDefault\":false,\"TechLabel\":\"InProgress\",\"Id\":\"01Jb\"},{\"attributes\":{\"type\":\"Status\",\"url\":\"/...\"},\"IsOpened\":true,\"IsDefault\":false,\"TechLabel\":\"Completed\",\"Id\":\"01Jb\"}]}}";
try {
org.json.JSONObject object = new JSONObject(jsonString);
jsonString = object.getString("responsejson");
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
JsonParser parser = new JsonParser();
JsonObject obj = parser.parse(jsonString).getAsJsonObject();
List<Value1> list1 = new Gson().fromJson(obj.get("value1"), new TypeToken<List<Value1>>() {}.getType());
List<Value2> list2 = new Gson().fromJson(obj.get("value2"), new TypeToken<List<Value2>>() {}.getType());
答案 3 :(得分:0)
由于您事先不知道json结构,最好的办法是使用支持默认地图和列表的GSON 2.0功能。 使用以下代码反序列化:
Object object = new Gson().fromJson(jsonString, Object.class);
创建的对象是Map(com.google.gson.internal.LinkedTreeMap),如下所示(对于上面的示例)
{responsejson = {value1 = [{data = Call,label = Call,default = false},{data = Email,label = Email,default = false}],value2 = [{attributes = {type = Status, url = / ...},IsOpened = false,IsDefault = true,TechLabel = NotStarted,Id = 01Jb},{attributes = {type = Status,url = / ...},IsOpened = false,IsDefault = false,TechLabel = InProgress,Id = 01Jb},{attributes = {type = Status,url = / ...},IsOpened = true,IsDefault = false,TechLabel =已完成,Id = 01Jb}]}}
使用生成的对象,解析它并将其保存在数据库中。 您可以使用以下命令将该映射序列化回JSON:
String json = new Gson().toJson(object);
希望这会对你有所帮助。
答案 4 :(得分:0)
只需定期读取流并将其保存到常规String中,然后解析该String:
// to get the general object that contains all the values
JSONObject json = new JSONObject(json_readed);
JSONObject response = json.getJSONObject("responsejson");
// to get the values
List<JSONArray> all_values = new ArrayList<JSONArray>();
Iterator<?> keys = response.keys();
while( keys.hasNext() ){
String value = (String)keys.next();
if( response.get(value) instanceof JSONArray ){
all_values.add(response.getJSONArray(value));
}
}
现在你将所有值(无论它的名称是什么)组合到名为(all_values)的ArrayList中。
请注意,您在问题中提供的JSON缺少在其开头和结尾打开“{”并关闭“}”括号。
答案 5 :(得分:0)
您需要做的是,首先从json字符串表示创建一个JsonObject,在此阶段没有给出具体细节。
JSONObject object = new JSONObject("json_here"); //catch all exceptions thrown.
有趣的是你提到结构不同,它认为很奇怪,我猜你是从不同的api实例中拉出来的。你需要做什么,创建一个pojo类,将api实例名称映射到返回的json字符串体。
在您获得感兴趣的对象后,请考虑使用GSON。一个Java序列化/反序列化库,用于将Java对象转换为JSON并返回。然后你需要做的是将pojo类序列化为一个对象。然后存储到数据库中。我建议使用领域而不是SQLite。
序列化类的示例。
class JClass {
private String jType;
private String json_body;
JClass() {
// no-args constructor
}
}
JClass j = new JClass();
j.jType ="some_type";
j.json_body = "json_body_here";
Gson gson = new Gson();
String json = gson.toJson(j);
然后获取json String对象,并存储在所选的数据库中。
答案 6 :(得分:0)
/*
* Method to parse InputStream to String JSON
* */
private String parse(InputStream in){
StringBuilder result;
try {
BufferedReader reader = new BufferedReader(new InputStreamReader(in));
result = new StringBuilder();
String line;
while ((line = reader.readLine()) != null) {
result.append(line);
}
Log.d("JSON Parser", "result: " + result.toString());
return result.toString();
} catch (IOException e) {
e.printStackTrace();
return null;
}
}
答案 7 :(得分:-1)
JSONParser parser = new JSONParser();
List<String> output = new ArrayList<String>();
try {
Object obj = parser.parse(data); // data is JSON
JSONObject jsonObject = (JSONObject) obj;
JSONArray msg = (JSONArray) jsonObject.get("value1");
JSONArray msg2 = (JSONArray) jsonObject.get("value2");
Iterator<String> iterator = msg.iterator();
while (iterator.hasNext()) {
output.add(iterator.next());
}
String[] stringArray = output.toArray(new String[0]);
return stringArray;
} catch (Exception e) {
return null;
}