2016-04-25 3 views
2

Я следующие данные JSON: -Как читать формы значение массива JSON в Java

{ 
    "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": 19.95 
     } 
    }, 
    "expensive": 10 
} 

Метод утверждать JSON: -

public void assertJsonvalue (String description, String jsonString, 
      String path, Object expectedValue) { 

     ObjectMapper objectMapper = new ObjectMapper(); 
     Map<String, Object> jsonMap = null; 
     try { 
      jsonMap = objectMapper.readValue(jsonString, 
        new TypeReference<Map<String, Object>>() { 
        }); 

     } catch (IOException e) { 
      fail("Could not parse json from string:" + jsonString); 
     } 

     Object actualValue = null; 
     try { 
      actualValue = PropertyUtils.getProperty(jsonMap, path); 
      System.out.println("actualValue" + actualValue); 
     } catch (IllegalAccessException e) { 
      // error here 
     } 
     assertEquals(description, expectedValue, actualValue); 

} 

Когда я пытаюсь получить JSon значение с помощью следующее: «Хорошо работает».

assertJsonValue("bicycle color", json, "store.bicycle.color", "red"); 

Я хочу получить значение массива от json, такого как детали 1-й книги.

Я пробовал следующее, что не помогает мне.

JSON пути заключаются в следующем: -

  1. "store.book [0]"
  2. "store.book [0]"
  3. "store.book.category"

Как это сделать?

+0

Что библиотеку вы используете – bmarkham

+0

я использую следующие библиотеки, такие как com.fasterxml.jackson.databind .JsonNode и org.codehaus.jackson.JsonNode – karan

ответ

3

Согласно this answer, вы должны быть в состоянии получить указанные свойства, как это:

assertJsonValue("...", json, "store.(book)[0].category", "reference"); 

Edit:

Какую версию Джексона и BeanUtils вы используете? Я изменил ваш метод немного, и сделал простой тест, используя beanutils 1.9.2 и jackson 2.6.5 тестов, кажется, прохожу:

import com.fasterxml.jackson.databind.ObjectMapper; 
import org.apache.commons.beanutils.PropertyUtils; 
import org.junit.Test; 

import java.io.IOException; 

import static org.junit.Assert.*; 

public class TestJson { 

    private static final String JSON = "{\n" + 
      " \"store\": {\n" + 
      "  \"book\": [\n" + 
      "   {\n" + 
      "    \"category\": \"reference\",\n" + 
      "    \"author\": \"Nigel Rees\",\n" + 
      "    \"title\": \"Sayings of the Century\",\n" + 
      "    \"price\": 8.95\n" + 
      "   }\n" + 
      "  ],\n" + 
      "  \"bicycle\": {\n" + 
      "   \"color\": \"red\",\n" + 
      "   \"price\": 19.95\n" + 
      "  }\n" + 
      " },\n" + 
      " \"expensive\": 10\n" + 
      "}"; 

    @Test 
    public void testJson() { 
     assertTrue(assertJsonValue(JSON, "store.(book)[0].category", "reference")); 
     assertTrue(assertJsonValue(JSON, "store.(book)[0].author", "Nigel Rees")); 
     assertTrue(assertJsonValue(JSON, "store.(book)[0].title", "Sayings of the Century")); 
     assertTrue(assertJsonValue(JSON, "store.(book)[0].price", 8.95)); 
    } 

    public boolean assertJsonValue(String jsonString, 
            String path, 
            Object expectedValue) { 

     ObjectMapper objectMapper = new ObjectMapper(); 
     try { 
      Object actual = PropertyUtils 
        .getProperty(objectMapper.readValue(jsonString, Object.class), path); 

      if (actual.equals(expectedValue)) { 
       return true; 
      } 

     } catch (IOException | ReflectiveOperationException e) { 
      // handle error 
     } 
     return false; 
    } 
} 
+0

Следующие не работают для меня. Путь («магазин. (Книга) [0] .category») возвращает «null». – karan

+0

Возможно, вы используете более старую версию jackson или beanutils? Я обновил свой ответ, чтобы показать, как я это проверил. – Edd

+0

Я обновил версию Commons-beanutils до версии 1.9.2. Теперь его работы хорошо. благодаря – karan