Как разобрать ответ json, если ответ не содержит информацию заголовка - PullRequest
0 голосов
/ 16 мая 2019

Я пытаюсь проанализировать ответ json, чтобы я мог получить элементы из объекта, получая следующую ошибку. Текст JSONObject должен начинаться с '{' в 1 [символ 2, строка 1]

public static  String parseJsonResponse(String json){
    String uId ="";

    try {
         JSONObject jsonObj = new JSONObject(json);
         // String fname = jsonObj.getString("fname");
         //String lname = jsonObj.getString("lname");
         String aId = jsonObj.getString("id");
         uId = aId; 
     } catch (Exception e) {
         e.printStackTrace();
     }
    return uId;
}

Вот ответ json с использованием почтальона, вы заметите, что заголовка нет

[
    {
        "id": "emplo000000000043567",
        "displayName": "Tester, user1",
           },
    {
        "id": "emplo000000000035386",
        "displayName": "Tester, User2",

    }
]

Ответы [ 3 ]

0 голосов
/ 16 мая 2019

Есть несколько идей для этого случая.Вот мое.

  1. С простой библиотекой json [ссылка] .

Вы можете просто изменить свою библиотеку на простую библиотеку json, которая имееткласс синтаксического анализатора для строки json, затем используйте метод instanceof для обнаружения перед обработкой объекта json.

import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;

public static  String parseJsonResponse(String json){
    String uId ="";

    try {
        JSONParser parser = new JSONParser();
        Object whichone = parser.parse(json);

        if(whichone instanceof JSONObject)
        {
            JSONObject jsonObj = (JSONObject)whichone;
             // String fname = jsonObj.getString("fname");
             //String lname = jsonObj.getString("lname");
            if(jsonObj.containsKey("id"))
                uId = (String)jsonObj.get("id");
       }
        else if(whichone instanceof JSONArray)
        {
            JSONArray jsonArr = (JSONArray)whichone;
            JSONObject jsonObj = null;

            for(int i = 0; i < jsonArr.size(); i++)
            {
                jsonObj = (JSONObject) jsonArr.get(i);
                if(jsonObj.containsKey("id"))
                {
                    uId = (String)jsonObj.get("id");
                    System.out.println(uId);
                }

            }
        }
        else if(whichone instanceof String)
        {
            System.out.println("1?????" + whichone.toString());
        }
        else
        {
            System.out.println("2?????" + whichone.toString());
        }

     } catch (Exception e) {
         e.printStackTrace();
     }
    return uId;
}
Определить тип объекта по исключению json.Вы можете определить, является ли какая-либо строка объектом json или массивом json при обработке исключений.
import org.json.JSONArray;
import org.json.JSONObject;

public static  String parseJsonResponse(String json){
    String uId ="";

    try {
        JSONObject jobj =  new JSONObject(json);

        if(jobj.has("id"))
            uId = jobj.getString("id");

        System.out.println(uId);

     } catch (org.json.JSONException e) {
         //e.printStackTrace();

         JSONArray jsonArr = new JSONArray(json);
         JSONObject jsonObj = null;

         for(int i = 0; i < jsonArr.length(); i++)
            {
                jsonObj = jsonArr.getJSONObject(i);
                if(jsonObj.has("id"))
                {
                    uId = (String)jsonObj.get("id");
                    System.out.println(uId);
                }

            }
     }
    return uId;
}
При работе с Java.

Вы можете найти его, будь то объект json или массив, после анализа первого символа.(Я думаю, что это будет работать ...)

import org.json.JSONArray;
import org.json.JSONObject;
public static  String parseJsonResponse(String json){
    String uId ="";

    boolean isJobj = json.charAt(0) == '[';

    if(!isJobj) {
        JSONObject jobj =  new JSONObject(json);

        if(jobj.has("id"))
            uId = jobj.getString("id");

        System.out.println(uId);

     } else {
         JSONArray jsonArr = new JSONArray(json);
         JSONObject jsonObj = null;

         for(int i = 0; i < jsonArr.length(); i++)
            {
                jsonObj = jsonArr.getJSONObject(i);
                if(jsonObj.has("id"))
                {
                    uId = (String)jsonObj.get("id");
                    System.out.println(uId);
                }

            }
     }
    return uId;
}

Хорошего дня ..

0 голосов
/ 16 мая 2019

Во-первых, у вас неверный формат json. Правильный формат JSON будет:

[
    {
        "id": "emplo000000000043567",
        "displayName": "Tester, user1"
    },
    {
        "id": "emplo000000000035386",
        "displayName": "Tester, User2"
    }
]

Теперь

  1. Ваш ответ - массив JSON. Поэтому сначала назначьте проанализированный объект в массив JSON как массив JSONArray = (JSONArray) obj ;
  2. этот массив JSON состоит из двух объектов JSON, поэтому просмотрите массив, получите каждый объект JSON и пару ключ / значение print / return сколько хотите.

Пример кода приведен ниже: (см. Логику)

public static void parseJsonResponse(String json)
            throws JsonParseException, JsonMappingException, IOException, ParseException {
        String aId ="";
        JSONParser parser = new JSONParser();
        Object obj = parser.parse(json);
        JSONArray array = (JSONArray) obj;
        for(int i=0;i<array.size();i++)
        {
            JSONObject jsonObject = (JSONObject) array.get(i);
            aId = (String) jsonObject.get("id");
            System.out.println(aId);
        }

    }

Примечание: здесь я использовал json-simple java library.

0 голосов
/ 16 мая 2019

Как и вышеупомянутый комментарий, это массив JSON, поэтому его нужно анализировать как массив JSON, а не как объект JSON. Просто используйте эквивалент JSONArray, предоставленный в используемой вами библиотеке.

В другом примечании, с ответом JSON выше, синтаксический анализ этого массива JSON завершится ошибкой, так как формат неправильный. Обратите внимание на запятую в конце каждого последнего ключевого значения в каждом объекте. Это может привести к сбою синтаксического анализатора при попытке проанализировать его как массив JSON. Если это была ваша ошибка, когда вы писали здесь фрагмент, тогда игнорируйте этот параграф. Иначе, если это был фактический ответ JSON, то я думаю, вам нужно задать новый вопрос ... на форуме Почтальона.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...