【问题标题】:Parsing an JSON Object and Array from REST从 REST 解析 JSON 对象和数组
【发布时间】:2015-04-22 23:02:10
【问题描述】:

我有以下 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();
    }
}

【问题讨论】:

  • 在方法参数中只接受一个字符串而不是InputStream。这是您面临的问题,实施jsonStreamToString?如果不是,请更详细地解释您所面临的问题到底是什么
  • 我很难将葡萄酒数组和前两个对象(类型和选择月份)分开。用什么样的数据结构来保存葡萄酒数组。JSONArray 似乎没有有很大帮助
  • 我建议不要尝试自己解析所有内容,而是使用 POJO。让 Jackson 将 JSON 解析为您的 POJO。 Wine 可以是一个类,AR 可以是一个带有List<Wine> 的类。您使用的是什么 JAX-RS 实现(和版本)(Jersey、Resteasy、CXF)?也许我可以帮助您开始使用 Jackson
  • 我正在使用 Jersey JAX_RS 2.0

标签: java json rest jax-rs


【解决方案1】:

我建议不要尝试自己解析所有内容,而是使用 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,请下载这些 jars

  • jersey-media-json-jackson - 选择版本(匹配您的 Jersey 2.x 版本,然后下载)

  • 从下图中获取所有的

    我有一张来自另一个帖子的 v2.2.3 的图片 - 忽略版本。您想要为所有这些获得 2.3.2 的版本。对于第一个依赖项,它们都可以在上面的链接中找到。只需在搜索栏中搜索它们。找到后,选择版本并下载。

一旦您拥有所有的 jars/依赖项,您就可以简单地使用从 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&lt;Wine&gt; 的类,以及顶级 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){

【讨论】:

  • 你帮了大忙。我会努力工作并及时通知你。非常感谢
猜你喜欢
  • 2016-11-20
  • 2013-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-09
  • 1970-01-01
  • 2021-09-30
  • 1970-01-01
相关资源
最近更新 更多