-1

考虑以下 JSON 输入:

{
    "url": [
        {
            "http://some_url": [
                {
                    "id": 1,
                    "name": "name1"
                }
            ]
        }
    ]
}

假设http://some_url是一个有效的 url。这在每个响应中都可能不同。我感兴趣的只是财产的价值http://some_url。但是由于密钥http://some_url可以更改,因此我很难为此创建 POJO。我只需要解组http://some_url. 在这种情况下是否可以进行部分解组?我有一个Details类作为我的java类。

类的基本内容Details是:

@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL)
public class Details {
   @JsonProperty("id")
   public String id;
   @JsonProperty("name")
   public String name;
}

由于我不确定如何进行部分解组,我正在做:

Map<String,String> respData = null;
ObjectMapper mapper = new ObjectMapper();
respData = mapper.readValue({JSON STRING},Map.class);

相反,我希望以某种方式将其转换为我的Details课程。我不太确定如何实现这一目标。

4

1 回答 1

0

设法弄清楚了。感谢一些深夜编码、stackoverflow 和一些红牛。我必须解析 JSON 并使用 JSONObject 的一部分。对此的启发是一个类似的问题,但是那个人改为解析 XML。请参阅:使用 JAXB 对 XML 进行部分解组以跳过一些 xmlElement。如果有人感兴趣,以下是代码。

POJO

@XmlRootElement(name="dummy") // Does not work if I have no @XmlRootElement. Any suggestions?
@XmlAccessorType(XmlAccessType.FIELD)
public class Details {
   @XmlElement(name = "id")
   public Double id;
   @XmlElement(name = "name")
   public String name;
}

解组类

        JSONObject obj = new JSONObject(response.getResponseBody()); // response.getResponseBody() returns a JSON string response from the API.
        JSONArray array = obj.getJSONArray("url");
        for(int i=0;i < array.length() ;i++) {
           JSONArray innerArray = array.getJSONObject(i).getJSONArray(url); // url is the http://some_url
           JSONObject obj1 = innerArray.getJSONObject(0);


           JSONObject obj2 = new JSONObject();
           // Needed to surround the JSONObject with a "dummy" property. Without this, my POJO class did not work. Is there a better way? 
           obj2.put("dummy",obj1);


           Configuration config = new Configuration();
           MappedNamespaceConvention con = new MappedNamespaceConvention(config);
           XMLStreamReader xmlStreamReader = new MappedXMLStreamReader(obj2, con);
           JAXBContext jc = JAXBContext.newInstance(Details.class);
           Unmarshaller unmarshaller = jc.createUnmarshaller();
           Details detailsPOJO = (Details) unmarshaller.unmarshal(xmlStreamReader);
           System.out.println("USER ID:"+detailsPOJO.id);
        }
于 2013-10-30T00:35:35.050 回答