使用 Jackson 解析 JSON 响应

Parsing JSON Response using Jackson

我写了一个网络服务并托管在下面 URL http://192.168.2.34:8081/MyWebService/facility/university

来自此网络服务的 JSON 格式的响应是:

{
  "university": [
    {
      "emailOfPrincipal": "prin1@gmail.com",
      "labLists": [
        {
          "instrumentLists": [
            {
              "instrumentId": "1",
              "instrumentName": "Instrument 1"
            },
            {
              "instrumentId": "2",
              "instrumentName": "instrument 2"
            }
          ],
          "labId": "11",
          "labName": "Lab 11"
        },
        {
          "instrumentLists": [
            {
              "instrumentId": "3",
              "instrumentName": "instrument 3"
            },
            {
              "instrumentId": "4",
              "instrumentName": "instrument 4"
            }
          ],
          "labId": "22",
          "labName": "Lab 22"
        }
      ],
      "univAddress": "Kolkata",
      "univId": "111",
      "univName": "University 111",
      "univPrincipalName": "Principal 1"
    },
    {
      "emailOfPrincipal": "prin2@gmail.com",
      "labLists": [
        {
          "instrumentLists": [
            {
              "instrumentId": "5",
              "instrumentName": "Instrument 5"
            },
            {
              "instrumentId": "6",
              "instrumentName": "Instrument 6"
            }
          ],
          "labId": "33",
          "labName": "Lab 33"
        },
        {
          "instrumentLists": [
            {
              "instrumentId": "7",
              "instrumentName": "Instrument 7"
            },
            {
              "instrumentId": "8",
              "instrumentName": "Instrument 8"
            }
          ],
          "labId": "44",
          "labName": "Lab 44"
        }
      ],
      "univAddress": "Bangalore",
      "univId": "222",
      "univName": "University 222",
      "univPrincipalName": "Principal 2"
    },
    {
      "emailOfPrincipal": "prin3@gmail.com",
      "labLists": [
        {
          "instrumentLists": [
            {
              "instrumentId": "9",
              "instrumentName": "Instrument 9"
            },
            {
              "instrumentId": "10",
              "instrumentName": "Instrument 10"
            }
          ],
          "labId": "55",
          "labName": "Lab 55"
        },
        {
          "instrumentLists": [
            {
              "instrumentId": "11",
              "instrumentName": "Instrument 11"
            },
            {
              "instrumentId": "12",
              "instrumentName": "Instrument 12"
            }
          ],
          "labId": "66",
          "labName": "Lab 66"
        }
      ],
      "univAddress": "Hyderabad",
      "univId": "333",
      "univName": "University 333",
      "univPrincipalName": "Principal 3"
    }
  ]
}

我正在尝试使用 jackson api 将 JSON 数据转换为 Java 对象。但是得到一个错误。 我的 Java 对象是:

University.java

public class University {
    private int univId;
    private String univName;
    private String univAddress;
    private String univPrincipalName;
    private String emailOfPrincipal;
    private List<Laboratory> labLists = new ArrayList<>();

    //... Getter and Setter Methods...
}

Laboratory.java

public class Laboratory {

    private int labId;
    private String labName;
    private List<Instruments> instrumentLists = new ArrayList<>();
    //... Getter and Setter Methods...
}

Instruments.java

public class Instruments {

    private int instrumentId;
    private String instrumentName;
    private String bookingStatus;
    private Date bookingFrom;
    private Date bookingTo;
    private Date requestedTime;

    //... Getter and Setter Methods...
}

写的客户端是:

public class ParseJSONData {

    public static void main(String[] args) throws ClientProtocolException, IOException {
        String URL = "http://192.168.2.34:8081/MyWebService/facility/university";
        DefaultHttpClient httpclient = new DefaultHttpClient();
        HttpGet httpget = new HttpGet(URL);
        HttpResponse response = httpclient.execute(httpget);
        // System.out.println(response);

        HttpEntity entity = response.getEntity();
        String result = EntityUtils.toString(entity);

        ObjectMapper mapper = new ObjectMapper();

        University universities = mapper.readValue(result, University.class);
        System.out.println(universities.getEmailOfPrincipal());
    }

我得到的错误是

Exception in thread "main" org.codehaus.jackson.map.exc.UnrecognizedPropertyException: Unrecognized field "university" (Class University), not marked as ignorable
 at [Source: java.io.StringReader@100edc0; line: 1, column: 16] (through reference chain: University["university"])

我知道我的 JSON 数据正在返回大学列表。但是我不知道如何映射列表中的那些。任何形式的帮助将不胜感激。

您可以添加 parent class

public class UniversityList {
    private List<University> university;
    //... Getter and Setter Methods...
}

我们是这样的:

ObjectMapper mapper = new ObjectMapper();
UniversityList list = mapper.readValue(json, UniversityList.class));
University university = list.getUniversity().get(0)

其他选项是为您的 University class

创建自定义解串器

这是演示:

public static void main(String[] args) throws IOException {
    ObjectMapper mapper = new ObjectMapper();
    SimpleModule module = new SimpleModule();
    module.addDeserializer(University.class, new UniversityDeserializer());
    mapper.registerModule(module);
    University university = mapper.readValue(json, University.class);
}

public static  class UniversityDeserializer extends JsonDeserializer<University> {
    private ObjectMapper unmodifiedMapper = new ObjectMapper();
    @Override
    public University deserialize(JsonParser p, DeserializationContext ctxt)
                                                                throws IOException{
        JsonNode node = p.readValueAsTree();
        JsonNode array = node.get("university");
        if (array != null && array.isArray()){
            JsonNode uniNode =  array.get(0);
            return unmodifiedMapper.treeToValue(uniNode, University.class);
        }
        return null;
    }
}