当响应不包含标题信息时,如何解析json响应

时间:2019-05-15 23:29:46

标签: java json parsing

我正在尝试解析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 :(得分:0)

就像上面提到的注释一样,它是一个JSON数组,因此需要将其解析为JSON数组而不是JSON对象。只需使用所使用的库中提供的JSONArray等效项即可。

另一方面,使用上述JSON响应,由于格式不正确,因此无法将其解析为JSON数组。注意每个对象中每个最后一个键值末尾的逗号。尝试将其解析为JSON数组时,这将导致解析器失败。如果这是您在此处编写代码段时的错误,请忽略此段。否则,如果这是实际的JSON响应,那么我想您需要在Postman论坛上提出一个新问题。

答案 1 :(得分:0)

对于这种情况有几种想法。 这是我的。

  1. 带有json简单库[link]

您可以简单地将您的库更改为json简单库,该库具有json字符串的解析器类 然后在处理json对象之前使用instanceof方法进行检测。

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;
}
  1. 从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;
}
  1. 使用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;
}

祝你有美好的一天。

答案 2 :(得分:0)

首先,您的json格式错误。正确的json格式为:

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

现在,

  1. 您的响应是JSON数组。因此,首先将已解析的对象分配为 JSONArray array =(JSONArray)obj ;
  2. 此JSON数组由两个JSON对象组成,因此遍历该数组,获取每个JSON对象并根据需要打印/返回键/值对。

下面是示例代码:(请参见逻辑)

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库。