2014-10-03 3 views
2

Я пошел через этот документ: https://github.com/jayway/JsonPathПоиска максимального значения поля JSon с использованием JsonPath в Java

Но я не мог понять, как найти максимальное значение конкретного поля. В данном json, что, если я хочу узнать цену самой дорогой книги?

Вот JSON:

{ 
    "store": { 
     "book": [ 
     { 
      "category": "reference", 
      "author": "Nigel Rees", 
      "title": "Sayings of the Century", 
      "price": 8.95 
     }, 
     { 
      "category": "fiction", 
      "author": "Evelyn Waugh", 
      "title": "Sword of Honour", 
      "price": 12.99 
     }, 
     { 
      "category": "fiction", 
      "author": "Herman Melville", 
      "title": "Moby Dick", 
      "isbn": "0-553-21311-3", 
      "price": 8.99 
     }, 
     { 
      "category": "fiction", 
      "author": "J. R. R. Tolkien", 
      "title": "The Lord of the Rings", 
      "isbn": "0-395-19395-8", 
      "price": 22.99 
     } 
     ], 
     "bicycle": { 
      "color": "red", 
      "price": 29.95 
     } 
    }, 
    "expensive": 10 
} 

Что бы выражение jsonpath (в Java), чтобы найти цену макс для книги. Ответ здесь должен быть 22.99.

ответ

0

Вы можете попробовать что-то вроде этого:

var myArray = JSON.parse(jsonAsString)["book"]; 
var max = myArray .reduce(function(a, b) { 
    return Math.max(a, b.price); 
}, 0); 
0

Пусть jPathStrB является StringBuilder из указанной выше JSON. (Edit: теперь я понимаю, что вы используете другую библиотеку jayway jsonpath, а не основанную на groovy. В этом ответе ниже используется JsonPath, который поставляется с уверенностью в отдыхе и использует метод groachy «max()».)

JsonPath jPath = new JsonPath(jPathStrB.toString()); 
    jPath.prettyPrint(); 
    Float price = jPath.get("store.book.price.max()"); 
    System.out.println("Max price: " + price); 

} 
0

Я довольно поздно к этой вечеринке, но с версии 2.4.0 JsonPath не поддерживает поведение, которое вы ожидаете.

От сопровождающему:

You are trying to apply the function max() to the result of the evaluation. That is not how things work. The function will be applied to each object matching the path.

Для того, чтобы получить ответ на свой вопрос, вам нужно вручную добавить каждый путь в массив:

$.max($.store.book[0].price, $.store.book[1].price, $.store.book[2].price, $.store.book[3].price) 

Я думаю, что на основе документации в README , большинство людей ожидают, что если предыдущие работы, то это также должно быть:

$.max($.store.book[*].price) 

Но вместо этого оно S ошибки:

Aggregation function attempted to calculate value using empty array 

Issue #191 имеет обсуждение, уходящее к 2016 году Существует также запрос старого тянуть: https://github.com/json-path/JsonPath/pull/197 , что, как представляется, this enhancement на него, в том числе, где найти его на Maven центрального.