我如何反序列化动态生成的 JSON 对象?

How can i deseralize a dynamic generated JSON Object?

我无法将对象反序列化回原始 class。问题是组件 class 必须以那种特殊的方式序列化,具有单独的 list/set object.The 属性的特征必须是单独的 key/value 对。如果我尝试反序列化 JSON/object,我会收到“无法构造 LinkedHashMap 实例”错误。

这是要解析为 JSON

的 class
public class Component {
    private Set<Attribute> attributes;
    private Set<Feature> features;
}
public class Attribute {
    private String type;
    private String key;
    private String value;
}

public class Feature {
    private String key;
    private String value;
}

这是序列化器

public class ComponentSerializer extends StdSerializer<Component> {
    public ComponentSerializer(){
        this(null);
    }

    public ComponentSerializer(Class<Component> c){
        super(c);
    }

    @Override
    public void serialize(Component com, JsonGenerator gen, SerializerProvider provider) throws IOException {
        gen.writeStartObject();
        
        for(Attribute att : com.getAttributes()){
           gen.writeStringField(att.getKey(),att.getValue());
        }

        Set<Feature> features = new HashSet<Feature>();

        for(Feature ftr : com.getFeatures()){
            features.add(new Feature(ftr.getKey(), ftr.getValue()));
        }

        gen.writeObjectField("features", features);
        gen.writeEndObject();
    }
    
}

结果JSON类似于

{
    "Foo": "Fooo",
    "Bar": "Barr",
    ...
    "features": [
      {
        "key": "foo",
        "value": "bar"
      },
      {
        "key": "bar",
        "value": "foor"
      }
      ...
    ]
 }

我的反序列化尝试

ObjectMapper mapper = new ObjectMapper();
Map<String, Object> map = mapper.readValue(p.getCodec().readTree(p).toString(), new TypeReference<Map<String, Object>>() {
});

    Set<Attribute> attributes = new HashSet<>();
    Set<Feature> features = new HashSet<>();

    for (Map.Entry<String, Object> entry : map.entrySet()) {
       if (entry.getKey().equals("features")){        
        
        //Here i cant create the Set<Features> from the object without the exception
        continue;
       }
       attributes.add(new Attribute("", entry.getKey(), entry.getValue().toString()));
    }

        ObjectMapper mapper = new ObjectMapper();
        Map<String, Object> map = mapper.readValue(p.getCodec().readTree(p).toString(), new TypeReference<Map<String, Object>>() {});

        Set<Attribute> attributes = new HashSet<>();
        Set<Feature> features = new HashSet<>();

        for (Map.Entry<String, Object> entry : map.entrySet()) {
            if (entry.getKey().equals("features")) {
                List<LinkedHashMap> featureList = (List<LinkedHashMap>) entry.getValue();
                featureList.stream().forEach(feature -> {
                    features.add(new Feature(feature.get("key").toString(), feature.get("value").toString()));
                });
                continue;
            }
            attributes.add(new Attribute("", entry.getKey(), entry.getValue().toString()));
        }