【问题标题】:How to get a single key-value from JSON using ObjectMapper in java如何在 java 中使用 ObjectMapper 从 JSON 中获取单个键值
【发布时间】:2020-02-24 18:21:36
【问题描述】:

我有一个名为 file.json 的 json 文件,其内容如下。

[
  {
    "symbol": "AAPL",
    "quantity": 100,
    "tradeType": "BUY",
    "purchaseDate": "2019-01-02"
  },
  {
    "symbol": "MSFT",
    "quantity": 10,
    "tradeType": "BUY",
    "purchaseDate": "2019-01-02"
  },
  {
    "symbol": "GOOGL",
    "quantity": 50,
    "tradeType": "BUY",
    "purchaseDate": "2019-01-02"
  }
]

我需要使用 ObjectMapper 在 JAVA 中将字段 symbol 下的值作为 ["AAPL","MSFT","GOOGL"] 的列表。关于如何获取符号中的值的任何建议?对于一个单独的 json 条目,我发现了有关如何使用 getter 和 setter 使用 POJO 映射值的文章。我可以对这个问题做同样的事情吗?怎么样?

POJO

class Stock {
      private String symbol;
      private float quantity;
      private String tradeType;
      private String purchaseDate;
      public String getSymbol(){
        return this.symbol;
      }
      public float getQuantity(){
        return this.quantity;
      }
      public String getTradeType(){
        return this.tradeType;
      }
      public String getPurchaseDate(){
        return this.purchaseDate;
      }
      public void setSymbol(String symbol) {
       this.symbol = symbol;
      }      
      public void setQuantity(float quantity) {
       this.quantity = quantity;
      }      
      public void setTradeType(String tradeType) {
       this.tradeType = tradeType;
      }      
      public void setPurchaseDate(String purchaseDate) {
       this.purchaseDate = purchaseDate;
      }      
}

【问题讨论】:

  • 是的,它的完成方式与单个条目完全相同,只是您使用 MyPojo[].class 作为类参数...然后它返回您的类的数组MyPojo跨度>
  • 如果不想为此创建 POJO,可以使用 Jackson 的 Tree Model API。
  • 如果你想花哨,可以使用JsonPath只选择你想要的字段。
  • MyPojo[].class 似乎不起作用

标签: java json parsing jackson-databind


【解决方案1】:

是的,你可以做到。

您的 JSON 代表一个对象数组。因此,您可以使用 Jackson 提供的 readValue 方法并获取 Java 对象数组。这就是你的 pojo 将发挥作用的地方,因为它将代表对象。

Stock[] stockArr = mapper.readValue(YourJson, Stock[].class);

然后您可以访问数组中的元素并在它们上调用您的 getter。

stockArr[0].getSymbol();

要获取所有符号,只需遍历数组即可:)

【讨论】:

  • @SomeshwarRoychowdhury 你也可以发布你的 pojo 吗?这应该工作......
  • 我也添加了 pojo。我先用 int 作为数量,然后按照这里写的那样浮动
  • @SomeshwarRoychowdhury 以及您在尝试我的回答时遇到了什么错误?
  • 我正在使用 vscode,它是已构建项目的一部分,当放置在 try catch 块中时,遇到此行后会移动到 catch 块
  • 你可以看到捕获了什么异常然后像这样:catch(Exception e) {System.out.println(e.toString());}
【解决方案2】:
@Test
public void testSymbols() throws IOException {
    String json = "[\n" + "  {\n" + "    \"symbol\": \"AAPL\",\n" + "    \"quantity\": 100,\n" + "    \"tradeType\": \"BUY\",\n"
            + "    \"purchaseDate\": \"2019-01-02\"\n" + "  },\n" + "  {\n" + "    \"symbol\": \"MSFT\",\n"
            + "    \"quantity\": 10,\n" + "    \"tradeType\": \"BUY\",\n" + "    \"purchaseDate\": \"2019-01-02\"\n" + "  },\n"
            + "  {\n" + "    \"symbol\": \"GOOGL\",\n" + "    \"quantity\": 50,\n" + "    \"tradeType\": \"BUY\",\n"
            + "    \"purchaseDate\": \"2019-01-02\"\n" + "  }\n" + "]";

     List list =  objectMapper.readValue(json ,List.class);
     List<String> symList = new ArrayList<>();
      list.stream().map( m-> ((LinkedHashMap) m).get("symbol")).forEach( o->{
        symList.add((String)o);
      });
      System.out.println(symList);
}

// 输出:[AAPL, MSFT, GOOGL]

【讨论】:

  • 我的程序显示 LinkedHashMap 无法解析为类型
  • list.stream().map( m-> ((Map) m).get("symbol")).forEach( o->{ symList.add((String)o); });
  • 尝试将 LinkedHashMap 更改为 Map。
  • 不是一个很好的解决方案
  • 如果走List路线,你真的应该使用CollectionType type = objectMapper.getTypeFactory().constructCollectionType( List.class, MyPojo.class )
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-11
  • 1970-01-01
  • 1970-01-01
  • 2017-07-05
  • 2019-04-09
相关资源
最近更新 更多