2015-01-07 70 views
2

嗨我正在使用jackson转换为json以用于我的api项目。我已经使用的依赖性是使用jackson jersey将复杂哈希映射转换为JSON

 <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对象。

任何帮助表示赞赏。

感谢 Sanjeev

+0

因此TimeInterval的属性是关键字,Cost是结果Hashmap中的值 –

+0

@naresh kumar yes。 – SanjeevGhimire

+0

将一些复杂对象作为映射关键字是一种不好的做法。 –

回答

1

你能否解释一下? JSON本质上是一个关键字,值对是字符串或值是数组,docuemnt,但是这又会在字符串级别。

+0

更具体地说,JSON键是ALWAYS字符串,不能是其他任何东西;而值可以是任何有效的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是一个简单的文本数据表示,下面的页面实际上在一个简短的HTML页面中定义了JSON语法http://json.org/

正如您所看到的基础构建块是对象和数组以及一些数据类型(字符串数字布尔值和空值)。

如果你需要一个哈希映射,你可以采取这样一个事实,即基本对象成员有些字典中键必须是字符串,值是和对象(或者是一个数组,以防止相同的时间间隔费用)。

所以现在你需要提供你自己的业务逻辑来为你的TimeInterval提供一个唯一的字符串表示,它可以解析回使用json的代码上的对象。

比方说,例如,通过分离的TimeInterval所开始和结束的时间价值“ - ”

E,G。你的时间的toString TimeInterval所会像

@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

我同意,但我想这取决于你的需求和偏好, –