Java Jackson解析动态JSON对象

时间:2017-02-17 09:57:47

标签: java json jackson

处理JSON对象的野兽方式是什么,具有以下结构:

{
  "Parameters": {
    "0": {
      "some key 0": "some value 0"
    },
    "1": {
      "some key 1": "some value 1"
    },
    "2": {
      "some key 2": "some value 2"
    },
    ....
    "n": {
      "some key n": "some value n"
    }
}

它包含从0到n(例如100)的属性,每个属性都是具有单个键值的对象。看起来所有的键都不一样。

是否可以将其转换为Parameter列表,其中每个参数都有下一个结构:

public class Parameter {
    String key;
    String value;
}

在杰克逊处理这个问题的最佳方法是什么?

2 个答案:

答案 0 :(得分:2)

如果密钥是动态的,那么我们可以使用@JsonAnySetter注释。

您可以尝试这样的事情:

ObjectMapper mapper = new ObjectMapper();
mapper.configure(DeserializationFeature.UNWRAP_ROOT_VALUE, true);

Parameters parameters = mapper.readValue(jsonData, Parameters.class);

Parameter类的内容将是:

@JsonRootName("Parameters")
class Parameters {
    private List<Map<String, String>> parameters = new ArrayList<Map<String, String>>();

    @JsonAnySetter
    public void setDynamicProperty(String name, Map<String, String> map) {
        parameters.add(map);
    }

    public List<Map<String, String>> getParameters() {
        return parameters;
    }

    public void setParameters(List<Map<String, String>> parameters) {
        this.parameters = parameters;
    }

}

答案 1 :(得分:1)

我认为Sachin的方法是正确的方向,但我会按照以下方式对其进行修改,并删除最终的一些嵌套地图:

@JsonRootName("Parameters")
public class Parameters {
    private List<Parameter> parameters = new ArrayList<>();

    @JsonAnySetter
    public void setDynamicProperty(String _ignored, Map<String, String> map) {
        Parameter param = new Parameter();
        param.key = map.keySet().iterator().next();
        param.value = map.values().iterator().next();
        parameters.add(param);
    }

    public List<Parameter> getParameters() {
        return parameters;
    }
}

public class Parameter {
    public String key, value;
}

反序列化后,getParameters()方法将返回Parameter个实例的列表。给定您的示例输入,当序列化为JSON时,其结构将如下所示:

[
  {
    "key": "some key 0",
    "value": "some value 0"
  },
  {
    "key": "some key 1",
    "value": "some value 1"
  },
  {
    "key": "some key 2",
    "value": "some value 2"
  },
  {
    "key": "some key n",
    "value": "some value n"
  }
]

请注意,keyvalue的提取使用迭代器,如果遇到空对象则会抛出异常。