2

我有一个长 JSON 字符串,表示从 WCF 服务返回的 string[] 数组。数组元素只是字符串,它们不是对象。这是返回数据的示例

    ["1|ArrayElement1","2|ArrayElement2","3|ArrayElement3"..."n|ArrayElementn"]

我不介意字符串中包含索引,但我需要将字符串解析为 Android 中的 ArrayList,以便将其调整为 ListView。

由于这些在技术上不是 JSONObjects,我如何遍历它们并从每个数组元素中提取字符串?

4

4 回答 4

8

这是一个有效的 JSON 字符串数组,您可以像这样正常解析它

JSONArray jsonStrings = json.getJSONArray("items");
String strings[] = new String[jsonStrings.length()];
for(int i=0;i<strings.length;i++) {
strings[i] = jsonStrings.getString(i);
}
于 2012-04-13T20:37:51.527 回答
0

也许这篇文章可以帮助你:

Android/Java 中的 JSON 数组迭代

  HashMap<String, String> applicationSettings = new HashMap<String,String>();
    for(int i = 0; i < settings.length(); i++){
        String value = settings.getJSONObject(i).getString("value");
        String name = settings.getJSONObject(i).getString("name");
        applicationSettings.put(name, value);
    }

 JSONArray names= json.names();
    JSONArray values = json.toJSONArray(names);
    for(int i = 0 ; i < values.length(); i++){
        if(names.getString(i).equals("description")){
            setDescription(values.getString(i));
        }
        else if(names.getString(i).equals("expiryDate")){
            String dateString = values.getString(i);
            setExpiryDate(stringToDateHelper(dateString)); 
        }
        else if(names.getString(i).equals("id")){
            setId(values.getLong(i));
        }
        else if(names.getString(i).equals("offerCode")){
            setOfferCode(values.getString(i));
        }
        else if(names.getString(i).equals("startDate")){
            String dateString = values.getString(i);
            setStartDate(stringToDateHelper(dateString));
        }
        else if(names.getString(i).equals("title")){
            setTitle(values.getString(i));
        }
    }
于 2012-04-13T20:30:06.160 回答
0

澄清一下,据我了解,您正在接收一个 JSON 字符串数组,这些字符串是以数组索引和管道字符为前缀的有效 JSON 字符串?

首先,我建议联系这个可憎的创造者,并就违反标准的行为进行教育。如果他们不听,就和他们的老板谈谈。这种事情在我看来是不可接受的,需要停止。

其次,我建议做这样的事情:

string[] element_strings = JSON.deserialize(WCF_string_result);
object[] elements = new object[element_strings.length];
for(int x = 0; x < elements.length; x++)
{
    int pipeIndex = element_strings.indexOf("|");
    elements[x] = JSON.deserialize(element_strings[x].substr(pipeIndex + 1));
}

当然,这假设您有某种反序列化 JSON 对象字符串的方法。如果您不这样做,我建议您使用 Android 中提供的内置库:

http://developer.android.com/reference/org/json/package-summary.html

于 2012-04-13T20:49:18.230 回答
0

如果您想使用 JSONArray 上的 Java8 流从中提取特定值。那么这段代码会有所帮助。

import java.util.stream.Collectors;
import java.util.stream.IntStream;

import org.json.JSONArray;

public class JsonArrayTest {

    public static void main(String[] args) {
        System.out.println("Output - "+ getValue("[{\"id\":\"11\",\"username\":\"ABC\"},{\"id\":\"12\",\"username\":\"ABC\"}]\""));
        System.out.println("Output - "+ getValue("[{\"id\":\"13\",\"username\":\"XYZ\"}]\""));
    }

    private static String getValue(String input) {
        JSONArray jsonArray = new JSONArray(input);

        return IntStream
                .range(0, jsonArray.length()).mapToObj(obj -> jsonArray.getJSONObject(obj))
                .filter(filterObj -> filterObj.getString("id") != null && "12".equals(filterObj.getString("id")))
                .map(finalObj -> finalObj.getString("username")).collect(Collectors.joining(""));
    }
    
}

注意:这只是一个示例,您如何使用流 API 从 JSONArry 中提取特定值。您可以根据需要更改过滤条件或将其删除。

于 2021-09-30T16:44:39.377 回答