0

我为我的 java 类创建了一个自定义序列化程序,其中包含许多嵌套对象。

我的动机是在序列化的 JSON 对象中添加 java 类的类型。

ex 我的班级类型是学生,创建的 JSON 是

{ id:1, name:abc }

我想把它当作

{id:1, name:abc, type:"Student "}

这并不难。我的问题是我的对象就像

{
  "description": null,
  "edit": [],
  "strategy": [
    {
      "description": null,
      "regions": {
        "region": []
      },
      "markets": {
        "market": [
          {},
          {}
        ]
      },
      "securityTypes": {},
      "parameter": [
        {
          "description": null,
          "enumPair": [],
          "name": "StartTime",
          "fixTag": 7602,
          "use": "REQUIRED",
          "mutableOnCxlRpl": true,
          "revertOnCxlRpl": null,
          "definedByFIX": false,
          "minValue": null,
          "maxValue": null,
          "constValue": null,
          "localMktTz": null
        },
        {},
        {},
        {}
      ],
      "edit": []
    }
  ],
  "draftFlagIdentifierTag": null,
  "changeStrategyOnCxlRpl": null,
  "imageLocation": null
}

我想为每个参数添加类型,剩下的所有东西都应该保持正常的序列化。

我尝试的是

public class StrategiesSerializer extends StdSerializer<StrategiesT> {
    
    public StrategiesSerializer() {
        this(null);
    }

    public StrategiesSerializer(Class<StrategiesT> strategies) {
        super(strategies);
    }

    @Override
    public void serialize(StrategiesT value, JsonGenerator gen, SerializerProvider provider) throws IOException {
        
        gen.writeStartObject();
        
        for(Field field: value.getClass().getDeclaredFields()) {
            System.out.println(field.getName());
            if(field.getName() != "strategy") provider.defaultSerializeField(field.getName(), field, gen);

            if(field.getName() == "strategy"){
                
                gen.writeArrayFieldStart("strategy");
                
                
                for(StrategyT strategy :  value.getStrategy()) {

                    for(Field strategyField : strategy.getClass().getDeclaredFields()) {
                        
                        provider.defaultSerializeField(strategyField.getName(), strategyField, gen);
                        
                    }
                    
                    gen.writeStartObject();
                    gen.writeStringField("type", strategy.getClass().getName());
                    gen.writeEndObject();
                }
                
                gen.writeEndArray();

            }
        }
        
        
        gen.writeEndObject();
    
    }
    
}

这给了我一些不正确的结果。

如果我能让自己更清楚,请告诉我。

4

0 回答 0