2012-04-13 4 views
2

У меня есть длинная строка JSON, представляющая массив строк [], возвращаемый из службы WCF. Элементы массива - это просто строки, они не являются объектами. Это пример данных возвратныхJSON Массив строк (без объектов), извлечение данных

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

Я не против индекса включаются в строку, но мне нужно, чтобы разобрать строки в ArrayList в Android, так что я могу адаптировать его к ListView.

Поскольку эти технически не являются JSONObjects, как я могу перебирать их и извлекать строку из каждого элемента массива?

+1

Я немного запутался. Является ли WCF возвратом строки, отформатированной как массив JSON или фактический массив строк? Если это массив, почему бы вам просто не перебирать каждый элемент * массива *, не выделять индекс и запускать десериализующую функцию JSON в результирующей строке? –

ответ

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); 
} 
+0

Да, это он, вскоре после публикации этого, я понял, что сделал это сложнее, чем нужно. – SmashCode

0

Может быть, это сообщение может помочь вам:

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)); 
     } 
    } 
+0

Не совсем, мне нужно было сделать что-то похожее на то, что вы разместили в других проектах Android, но это касалось JSONArrays, в котором содержались объекты. Если возвращаемые данные были в формате ["Name": "the_name", ...] Мне было бы хорошо, но если вы посмотрите на возвращаемые данные, ваш код не будет работать. – SmashCode

+0

Thats true, сообщение ниже может быть больше того, что вы ищете. –

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

Смежные вопросы