JSON 字符串数组(无对象),提取数据
Posted
技术标签:
【中文标题】JSON 字符串数组(无对象),提取数据【英文标题】:JSON Array of strings (no objects), extracting data 【发布时间】:2012-04-26 05:34:08 【问题描述】:我有一个长 JSON 字符串,表示从 WCF 服务返回的 string[] 数组。数组元素只是字符串,它们不是对象。这是一个返回数据的例子
["1|ArrayElement1","2|ArrayElement2","3|ArrayElement3"..."n|ArrayElementn"]
我不介意字符串中包含索引,但我需要将字符串解析为 android 中的 ArrayList,以便我可以将其调整为 ListView。
由于这些在技术上不是 JSONObject,我如何遍历它们并从每个数组元素中提取字符串?
【问题讨论】:
我有点困惑。 WCF 是返回格式为 JSON 数组还是实际字符串数组的字符串?如果它是一个数组,为什么不遍历每个 array 元素,去掉索引并在结果字符串上运行 JSON 反序列化函数? 【参考方案1】:这是一个有效的 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);
【讨论】:
是的,就是这样,发布后不久,我意识到我让这变得比需要的更困难。【参考方案2】:也许这篇文章可以帮助你:
JSON Array iteration in Android/Java
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));
【讨论】:
不是真的,我不得不做一些与您在其他 Android 项目中发布的内容类似的事情,但那是处理包含对象的 JSONArrays。如果返回的数据是格式 ["Name" : "the_name", ... ] 我很好,但是如果您查看返回的数据,您的代码将无法正常工作。 没错,下面的帖子可能更符合您的要求。【参考方案3】:澄清一下,据我了解,您正在接收一个 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
【讨论】:
【参考方案4】:如果您想使用 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 中提取特定值。您可以根据需要更改或删除过滤条件。
【讨论】:
以上是关于JSON 字符串数组(无对象),提取数据的主要内容,如果未能解决你的问题,请参考以下文章
在 BigQuery 中,将对象的字符串化数组转换为非字符串化