Android - 将InputStream中的JSON保存到String中

时间:2014-12-18 09:50:48

标签: java android json inputstream

我试图解析我从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将显示哪些值。

8 个答案:

答案 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;
}