使用jackson jersey将复杂的hashmap转换为JSON

时间:2015-01-07 05:41:25

标签: java json jackson jersey-2.0

您好我正在使用杰克逊为我的api项目转换为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和Cost

我需要创建一个地图

Map<TimeInterval, Cost>

将使用jackson提供程序转换为JSON。

它转换得很好,但我得到的关键是toString作为字符串而不是json对象。

感谢任何帮助。

感谢 Sanjeev

3 个答案:

答案 0 :(得分:1)

你能详细说明吗? JSON本质上是一个键值对,它们都是字符串或值是数组,docuemnt但是它也将在叶级别的字符串中。

答案 1 :(得分:1)

好的,将两个类转换为HashMap,如

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

根据您的要求构建第三个hashmap。

答案 2 :(得分:0)

JSON是一个简单的数据文本表示,下一页实际上在一个简短的HTML页面http://json.org/中定义了JSON语法。

正如您所看到的,构建块的基础是对象和数组以及一些数据类型(字符串编号为Boolean和null)。

如果你需要一个哈希映射,你可以认为基本对象成员有点像字典,其中键必须是一个字符串,值是和对象(如果相同的时间间隔成本很少,则为数组) )。

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

比方说,以“ - ”分隔的TimeInterval的开始和结束的时间值

E,G。你的时间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
        }
    ]
}

我猜你可以想到其他的实现方法,只需要记住输出应该包含足够的数据来在消费方面轻松解析结果。