Android:处理可以是字符串或数组的json对象

时间:2012-10-05 09:40:03

标签: java android arrays json

进入一种不确定如何处理它的情况。

我有来自服务器的json数据;例如:(我只是发布json的一部分,所以,是的,json是有效的)

    "wall_id": 889149,
    "poster_image_thumbnail": "http:\/\/www.mface.me\/images\/avatar\/thumb_62441559ddb1dda7513d0f94.jpg",
    "post_type": "profile",
    "post_content": [{
        "text": "",
        "images_count": 1,
        "images": ["https:\/\/fbcdn-sphotos-a-a.akamaihd.net\/hphotos-ak-ash4\/227408_475848819113499_663318592_n.jpg"]
    }]

创建了一个用于存储此json数据的类

public class feedFormat{
    Integer wall_id;
    String poster_image_thumbnail;
    String post_type;
    String post_content;
}

有时 post_content 可以为空,或者数组如上例所示。我在feedFormat中将post_content声明为String。这显然是抛出强制转换异常(将数组转换为字符串?)。

我期待JSONObject将其作为字符串读取,然后从那里将其转换为数组,但似乎没有那样。

如何动态处理字符串或数组?如果它是一个数组,我需要将其分解。

我将这个应用程序从IOS移植到android,在IOS中有一个“id”对象,可以是任何类。我检查这个类是NSSTring还是NSArray并从那里拿走它。在Java中,我不确定如何处理它。

非常感谢任何建议

5 个答案:

答案 0 :(得分:1)

如果你的JSON数组是空的,那就是:

"post_content": []

然后它将保持一个数组,具有0大小的特殊性。

然后我建议你直接将你的JSON数组解析成适当的数据结构,无论大小如何,比如ArrayList>例如。然后,您将能够浏览JSON数组的所有项目,并为每个项目在您的arraylist中添加一个新的HashMap。每个hashmap都包含一对键值。

但是,如果我理解你的JSON,它似乎总是一个由三个元素组成的数组,第三个元素本身就是一个数组,其大小由属性images_count给出。这不是很好,你的JSON结构应该是:

"post_content": {
    "text": "",
    "images": [
        "https://fbcdn-sphotos-a-a.akamaihd.net/hphotos-ak-ash4/227408_475848819113499_663318592_n.jpg"
    ]
}

由于图像是一个数组,因此您可以很容易地获得它的大小。

答案 1 :(得分:0)

JSONObject具有名为has(String key)的函数,用于检查是否存在密钥映射,isNull(String key)检查特定密钥是否为null。在阅读之前使用这些来检查密钥。

答案 2 :(得分:0)

您可以像jsonobject.has("post_content")

一样查看
if(jsonobject.has("post_content")) {
   /// read array and do remaining stuff
}else {
  // if not read another strings and put post_content as null.
}

答案 3 :(得分:0)

public class FeedFormat{
    Integer wall_id;
    String poster_image_thumbnail;
    String post_type;
    JSONArray post_content;
}

feedFormat toto = new feedFormat();
toto.post_content = yourJsonObject.getJsonArray("post_content");

这是做你想做的最简单的方法。另一种方法是创建另一个类。

public class FeedFormat{
    Integer wall_id;
    String poster_image_thumbnail;
    String post_type;
    ArrayList<PostContent> post_content = new ArrayList<PostContent>();
}

public class PostContent {
    String text;
    Integer imageCount;
    ArrayList<String> images = new ArrayList<String>();
}

使用它可以将每个帖子内容处理成特定对象,而不是使用JSONObject / JSONArray。

答案 4 :(得分:0)

您可以使用以下内容:

String data= "wall_id": 889149,
"poster_image_thumbnail": "http:\/\/www.mface.me\/images\/avatar\/thumb_62441559ddb1dda7513d0f94.jpg",
"post_type": "profile",
"post_content": [{
    "text": "",
    "images_count": 1,
    "images": ["https:\/\/fbcdn-sphotos-a-a.akamaihd.net\/hphotos-ak-ash4\/227408_475848819113499_663318592_n.jpg"]
}]

JSONArray jArray=data.getJSONArray("post_content");
for(int i=0; i<jArray.length(); i++)
{
JSONObject jObj=jArray.getJSONObject(i);
String text=jObj.getString("text");
int images_count=jObj.getInt("images_count");
String images=jObj.getInt("images");
}