簡體   English   中英

從REST解析JSON對象和數組

[英]Parsing an JSON Object and Array from REST

我想將以下JSON從REST解析為JAVA。 我有一個AR對象和一個方法,並以wine為參數。 我該怎么辦?

 {
    "type": "AR",
    "selection_month": "Feb/2015",
    "wines": [
      {
          "variety": "RED",
          "wine_type": "TABLE",
          "label_name": "The Mission",
          "grape": "Merlot",
          "region": "Napa",
          "country": "USA",
          "maker": "Sterling",
          "year": "2014"
      },
      {
          "variety": "RED",
          "wine_type": "TABLE",
          "label_name": "Joseph Phelps Cabernet Sauvignon 2012",
          "grape": "Cabernet Sauvignon",
          "region": "Napa",
          "country": "USA",
          "maker": "Joseph Phelps",
          "year": "2012"
      },
      {
          "variety": "RED",
          "wine_type": "TABLE",
          "label_name": "Round Pond Estate Rutherford",
          "grape": "Cabernet Sauvignon",
          "region": "Napa",
          "country": "USA",
          "maker": "Rutherford",
          "year": "2014"
      },
      {
          "variety": "RED",
          "wine_type": "TABLE",
          "label_name": "Dona Paula Black Label",
          "grape": "Bordeaux",
          "region": "",
          "country": "Argentina",
          "maker": "Dona Paula",
          "year": "2013"
      },
      {
          "variety": "RED",
          "wine_type": "TABLE",
          "label_name": "Schug Sonoma Coast Pinot Noir",
          "grape": "Pinot Noir",
          "region": "Sonoma Valley",
          "country": "USA",
          "maker": "Walter Schug",
          "year": "2013"
      },
      {
          "variety": "RED",
          "wine_type": "TABLE",
          "label_name": "Caymus Special Selection Cabernet Sauvignon",
          "grape": "Cabernet Sauvignon",
          "region": "Napa Valley",
          "country": "USA",
          "maker": "Charles F. Wagner",
          "year": "2014"
      }
    ]
  }

我有以下方法

@POST
public Response addAR(InputStream incomingData){
    String parsedJson = jsonStreamToString(incomingData);
    try {
        JSONObject json = new JSONObject(parsedJson);

        String name = json.getString("name");


        int uid = useCase.createAR(name);

        JSONObject jsonResponse = new JSONObject(new JSONStringer().object()
                .key("id").value(uid).endObject().toString());

        return Response.status(201).entity(jsonResponse.toString()).build();
    } catch (JSONException e) {

        e.printStackTrace();
        return Response.status(404).entity(e.toString()).build();
    }
}

我建議不要嘗試自己解析所有內容,並使用POJO。 讓Jackson將JSON解析到您的POJO中。 Wine可以是一個類,而AR可以是具有List<Wine>

“我正在使用Jersey JAX_RS 2.0”

要獲得Jackson支持,如果您使用的是Maven,只需添加此依賴項

<dependency>
    <groupId>org.glassfish.jersey.media</groupId>
    <artifactId>jersey-media-json-jackson</artifactId>
    <version>${jersey2.version}</version>
</dependency>

如果您不使用Maven,請下載這些jar

  • jersey-media-json-jackson-選擇版本(與您的Jersey 2.x版本匹配,然后下載)

  • 從下圖獲取所有內容

    在此處輸入圖片說明

    我從v2.2.3-的另一個帖子中獲得了一個圖像,而忽略了該版本。 您希望所有版本都獲得2.3.2的版本。 對於第一個依賴項,都可以在上面的鏈接中找到它們。 只需在搜索欄中搜索它們即可。 找到它后,選擇版本並下載。

一旦有了所有的jar /依賴關系,您就可以簡單地使用從JSON轉換的POJO。 例如,您可以Wine

public class Wine {
    private String variety;
    @JsonProperty("wine_type")
    private String wineType;
    @JsonProperty("label_name")
    private String labelName;
    private String grape;
    private String country;
    private String maker;
    private String year;

    // proper Getters and Setters mathing for form
    // public String getVariety()
    // public void setVariety(String variety)
    // basically following JavaBean naming convention
}

您將需要適當的JavaBean風格的getter和setter。 您會注意到其中兩個字段具有@JsonProperty批注。 這是因為帶有_ (下划線)的JSON屬性無法很好地映射到方法,因此我們需要命名該屬性。

然后,您可以擁有另一個具有List<Wine> ,以及頂級JSON對象的其他屬性。 例如

public class AR {
    private String type;
    @JsonProperty("selection_month")
    private String selectionMonth;
    private List<Wine> wines;

    // Getters and Setters
}

現在,您可以簡單地將AR類型用作方法參數。 您可以直接使用AR對象

@POST
@Consumes(MediaType.APPLICATION_JSON)
public Response addAR(AR ar){

暫無
暫無

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

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