javajackson解析动态JSON对象

javajackson解析动态JSON对象,java,json,jackson,Java,Json,Jackson,beast处理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":

beast处理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"
    }
}
public class Parameter {
    String key;
    String value;
}
它包含从0到n的属性(例如100),每个属性都是一个具有单个键值的对象。看起来所有的钥匙都不一样

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

{
  "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"
    }
}
public class Parameter {
    String key;
    String value;
}

在jackson中处理此问题的最佳方法是什么?

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

您可以尝试以下方法:

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

Parameters parameters = mapper.readValue(jsonData, Parameters.class);
其中,
参数
类的内容为:

@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;
    }

}
@JsonRootName(“参数”)
类参数{
私有列表参数=新的ArrayList();
@JSONANYSETER
public void setDynamicProperty(字符串名称、映射){
参数。添加(映射);
}
公共列表getParameters(){
返回参数;
}
公共void setParameters(列出参数){
此参数=参数;
}
}

我认为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;
}

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

使用
ObjectMapper
@rostyslavroshak检查:我不知道内部JSON对象的键的名称。你是说
参数
是动态的吗@Rostyslavroshak我的意思是,对于内部对象:{“some key 0”:“some value 0”},键的值是未知的。我想把它作为参数POJO中的键来处理,问题是json中没有对象数组。“0”、“1”是json对象的字段。是的,这就是我使用@JsonAnySetter注释的原因。抱歉,刚刚做了一些小测试,一切都正常。