2016-12-28 4 views
1

Я пытаюсь отправить вызов API с помощью json-simple 1.1.1, и я сохраняю поля и значения как HashMap. Я должен отправить эти параметры:Как поместить массив в Hashmap для кодирования объекта JSON

{ api_key : string, 
    product_id : string, 
    name : string, 
    tax_rates : array } 

Вот HashMap пример:

HashMap<String,Object> arg = new HashMap<String, Object>(); 
      arg.put("product_id","42"); 
      arg.put("name", "EKOS"); 
      arg.put("tax_rates", taxarray); 

Я спас taxarray как HashMap, а также:

HashMap<String, Object> taxarray = new HashMap<String, Object>(); 
      taxarray.put("name","EKOS"); 
      taxarray.put("type", "type_value_fixed"); 
      taxarray.put("value", "56"); 

Но когда я выполнить API называют его повторяет ошибку: Параметр «tax_rates» недействителен. Необходимым типом параметра является массив.

Я пытался сохранить taxarray HashMap как JSONArray, а также. Не могли бы вы мне помочь?

Дополнительный вопрос: как я могу сэкономить 2 или более налогов в пределах одного «tax_rates»? Вот пример:

HashMap<String,Object> arg = new HashMap<String, Object>(); 
       arg.put("product_id","42"); 
       arg.put("name", "EKOS"); 
       arg.put("tax_rates", array [ 
            taxarray1[], 
            taxarray2[] 
              ]); 
+0

Как предложение вы должны использовать объект Json для хранения объекта, например: { "product_id": 42, "Название": "ЭКОС", " tax_rates": { "а": "б", "с": "D", "е": "F" } } – user1211

+0

Хм ... Я бы не рекомендовал этот подход. 'HashMap' не эквивалентен объекту JavaScript; его целью является захват объектов, реализующих один и тот же интерфейс. Хотя вы можете заставить это работать, это не способ Java. Я бы рекомендовал попробовать что-то вроде подхода на https://www.mkyong.com/java/jackson-2-convert-java-object-to-from-json/, чтобы использовать существующие инструменты для сопоставления ваших классов JSON с Java, которые захватывают вашей ожидаемой структуры на более Java-пути. – sadakatsu

ответ

1

Вы должны иметь что-то вроде этого - Налоговый класс:

public class Tax { 
    String name; 
    String type; 
    Integer[] values; 

    public Tax(String name, String type, Integer[] values) { 
     this.name = name; 
     this.type = type; 
     this.values = values; 
    } 
} 

И затем использовать массив объектов класса Налоговой вместо HashMap для tax_rates : array.

Этот код с помощью Google JSON:

Map<String, Object> arg = new HashMap<String, Object>(); 
arg.put("product_id", "42"); 
arg.put("name", "EKOS"); 
arg.put("tax_rates", 
       new Tax[] { new Tax("EKOS", "type_value_fixed", new Integer[] { 1, 2, 3 }), 
         new Tax("ABC", "type_value_fixed", new Integer[] { 4, 5 }), 
         new Tax("DEF", "type_value_fixed", new Integer[] { 6, 7}) }); 

Gson gson = new Gson(); 

System.out.println(gson.toJson(arg)); 

даст вам такое JSON:

{ 
    "product_id": "42", 
    "name": "EKOS", 
    "tax_rates": [ 
    { 
     "name": "EKOS", 
     "type": "type_value_fixed", 
     "values": [ 
     1, 
     2, 
     3 
     ] 
    }, 
    { 
     "name": "ABC", 
     "type": "type_value_fixed", 
     "values": [ 
     4, 
     5 
     ] 
    }, 
    { 
     "name": "DEF", 
     "type": "type_value_fixed", 
     "values": [ 
     6, 
     7 
     ] 
    } 
    ] 
} 
+1

Я рекомендую эту идею; было бы лучше даже для архитектуры его проекта. –

0

tax_rates должен быть массивом, поэтому сделать это:

List<Double> taxRates = new ArrayList<Double>(); 
taxRates.add(19); 
taxRates.add(17.5); 

Map<String,Object> arg = new HashMap<String, Object>(); 
arg.put("product_id","42"); 
arg.put("name", "EKOS"); 
arg.put("tax_rates", taxRates);