2015-01-07 4 views
2

Привет, я использую jackson для преобразования в json для моего проекта api. зависимость я использовал этоПреобразование комплекса hashmap в JSON с использованием jackson jersey

 <dependency> 
      <groupId>com.fasterxml.jackson.jaxrs</groupId> 
      <artifactId>jackson-jaxrs-json-provider</artifactId> 
      <version>2.4.3</version> 
     </dependency> 

     <dependency> 
      <groupId>org.codehaus.jackson</groupId> 
      <artifactId>jackson-mapper-asl</artifactId> 
      <version>1.9.13</version> 
     </dependency> 

У меня есть два класса

TimeInterval и затраты

Мне нужно создать карту

Map<TimeInterval, Cost> 

, которые будут преобразованы в формат JSON с помощью Джексона поставщик.

Он преобразует его в порядке, но ключ, который я получаю, является toString как строка не как объект json.

Любая помощь приветствуется.

благодаря Санджив

+0

Так что свойства TimeInterval являются ключами, а стоимость - значениями в полученном результате Hashmap –

+0

@naresh kumar yes. – SanjeevGhimire

+0

Наличие сложного объекта в качестве ключа карты - плохая практика. –

ответ

1

Можете ли вы уточнить? JSON по сути является ключом, пара значений - как строка, так и значение - массив, documentemnt, но это снова будет в строке на уровне листа.

+0

В частности, ключи JSON - это ВСЕГДА, и они не могут быть другими; тогда как значением может быть любой допустимый тип значения JSON, включая Object, Array, String, Number, Boolean или 'null'. – StaxMan

1

Хорошо новообращенный оба класса в HashMap как

Map<String,Object> map_values = mapper.convertValue(Object(TimeInterval/Cost), Map.class); 

И построил третий HashMap согласно вашему требованию.

0

JSON - это простое текстовое представление данных, следующая страница на самом деле определяет синтаксис JSON на одной короткой странице HTML http://json.org/.

Как вы можете видеть, основные строительные блоки - это объекты и массивы, а некоторые типы данных (номер строки Boolean и null).

Если вам нужна карта хэша, вы можете принять тот факт, что базовые члены объекта - это словарь, где ключ должен быть строкой, а значение - и объектом (или массивом в случае, если один и тот же интервал времени расходы).

Итак, теперь вам нужно предоставить свою собственную бизнес-логику, чтобы предоставить уникальное строковое представление для вашего TimeInterval, которое может быть проанализировано обратно на объект в коде, который потребляет json.

Скажем, например, значение времени начала и конца TimeInterval разделенных «-»

е, г. Ваше время TimeInterval ToString будет выглядеть

@Override 
public String toString() { 
    //start and end are of type Date 
    return start.getTime()+"-"+end.getTime(); 
} 

Теперь полученный JSON будет выглядеть

{ 
    "1420667419892-1420698059892" : { 
     "ammount" : 10.9, 
     "currency" : "USD" 
    }, 
    "1420698059892-1420706699892" : { 
     "ammount" : 10.9, 
     "currency" : "ERO" 
    } 
} 

Но если TimeInterval больше усложнит и выше вариант не представляется возможным.Вам понадобится некоторый суррогатный ключ для TimeInterval, тогда вам придется создать Обмотка объект, который будет включать вас словарь и набор или существующий IntervalIdToCost

public class TimeToCostMapWarpper { 
    //Map TimeInterval.Id to Cost 
    Map<String, Cost> intervalIdToCost = new HashMap<>(); 
    Set<TimeInterval> timeIntervals = new HashSet<>(); 
//getter/setter... 
} 

Теперь вы сериализовать объект обертку и получить что-то вроде:

{ 
    "intervalIdToCost" : { 
     "1f3fe6cf-7afe-4575-b8b2-bbe2067a99bd" : { 
      "ammount" : 10.9, 
      "currency" : "ERO" 
     }, 
     "d2c880ce-ef41-48f8-8f4a-0ff73449e1c3" : { 
      "ammount" : 10.9, 
      "currency" : "USD" 
     } 
    }, 
    "timeIntervals" : [{ 
      "id" : "1f3fe6cf-7afe-4575-b8b2-bbe2067a99bd", 
      "start" : 1420702028475, 
      "end" : 1420710668475 
     }, { 
      "id" : "d2c880ce-ef41-48f8-8f4a-0ff73449e1c3", 
      "start" : 1420693388475, 
      "end" : 1420702028475 
     } 
    ] 
} 

Я думаю, что вы могли бы подумать о других, кто реализует это, просто нужно иметь в виду, что выход должен содержать достаточно данных для простого анализа результата на стороне потребления.

+0

Обратите внимание, что ваш первый объект выше недействителен, так как он имеет два идентичных ключа. Кроме того, неразумно иметь объект JSON, где ключи являются «переменными». Гораздо лучше иметь массив объектов, где «переменная» величина является частью значения пары ключ/значение в каждом объекте. (Это в основном то, что вы сделали со структурой «timeIntervals» во втором примере.) –

+0

Согласен, но я думаю, это зависит от ваших потребностей и предпочтений, –

Смежные вопросы