簡體   English   中英

用 jackson 讀取 JSON object

[英]Reading JSON object with jackson

我想用 jackson 反序列化以下 json object:

{
    "_embedded": {
        "endpoints": [
            {
                "name": "Tester",
                "id": "48aba1b3-3585-4327-a20f-627a1749611b",
                "componentId": "Darwin2",
                "_links": {
                    "self": {
                        "href": "www.google.com"
                    },
                    "network": {
                        "href": "www.google.com"
                    },
                    "appWans": {
                        "href": "www.google.com"
                    },
                    "services": {
                        "href": "www.google.com"
                    },
                    "endpointGroups": {
                        "href": "www.google.com"
                    },
                    "geoRegion": {
                        "href": "www.google.com"
                    },
                    "dataCenter": {
                        "href": "www.google.com"
                    }
                }
            }
        ]
    },
    "_links": {
        "first": {
            "href": "www.google.com"
        },
        "last": {
            "href": "www.google.com"
        }
    },
    "page": {
        "size": 2000,
        "totalElements": 1,
        "totalPages": 1,
        "number": 1
    }
}

我的目標是實現一個Embedded object 然后在這個 object 添加另一個 object 稱為Endpoints 理想情況下,我可以訪問端點 object 的 id 屬性。 但是,我不斷收到反序列化錯誤。 目前我正在使用這個 class:

import java.util.HashMap;
import java.util.Map;
import com.fasterxml.jackson.annotation.JsonProperty;

@lombok.Value
public class Endpoints {

  @JsonProperty("_embedded")
  private Map<String, Object> embedded = new HashMap<>();

}

這至少讓我有機會做以下事情:

 Endpoints result = apiRequest.get();
    if (result != null) System.out.println(result.getEmbedded().get("endpoints"));

它打印出端點數組,但我不能使用它。 我必須實現一個 java object。 對此問題的任何幫助將不勝感激。

So I have no idea what frameworks you use, or where this JSON data comes from, but you mentioned Spring HATEOS, so here is a solution using Jackson and Spring HATEOAS:

@Data
public class Endpoint extends RepresentationModel<Endpoint> {
    private String name;
    private String id; // Could be a UUID type instead??
    private String componentId;
}

@Service
public class MyService {
    @Autowired
    private ObjectMapper objectMapper;

    public void foo() {
        String mysteryString = apiRequest.get();
        PagedModel<Endpoint> endpointsPage = objectMapper.readValue(mysteryString, new TypeReference<PagedModel<Endpoint>>);
        
        for (Endpoint e : endpointsPage) {
            System.out.println(e.getName());
        }
    }
}

Spring HATEOAS 文檔指南 另請查看我使用過的類的 Javadoc。

如果您希望Endpoint成為 Lombok 值(即,所有最終值),您需要一個帶有適當“@JsonCreator”和“@JsonProperty”注釋的構造函數,因此 Jackson 知道如何構建您的 Object(參見“指南”鏈接)。

還有一些關於Jackson的閱讀。

Then again, if you are using Spring and you could just use Spring RestTemplate to fetch the Data from the remote API, you don't even need to manually use Jackson ObjectMapper:

PagedModel<Endpoint> endpointsPage = 
    restTemplate.exchange(apiUrl, 
                          HttpMethod.GET, 
                          null, // RequestEntity (body of request)
                          new ParameterizedTypeReference<PagedModel<Endpoint>>() {}).getBody();

整個TypeReferenceParameterizedTypeReference業務只需要 bc。 我們正在處理 generics。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM