में उपलब्ध जानकारी के आधार पर कितना deserialize मैं Product
इंटरफ़ेस के कई अलग-अलग कार्यान्वयन deserialize करने के लिए जैक्सन का उपयोग कर रहा हूँ। इन उत्पाद कार्यान्वयन में अलग-अलग फ़ील्ड हैं, लेकिन सभी में InsuredAmount
फ़ील्ड है। यह InsuredAmount
वर्ग का मूल्य फ़ील्ड और IAType
फ़ील्ड है। IAType
कार्यान्वयन के रूप में विभिन्न enums के साथ एक मार्कर इंटरफ़ेस है।अभिभावक वर्ग
अब यहां समस्या है: IAType
इंटरफ़ेस के enum कार्यान्वयन Product
इंटरफ़ेस के एक निश्चित कार्यान्वयन से मेल खाते हैं। मैं सामान्य कार्यान्वयन कैसे कर सकता हूं और जैक्सन को आपके IAType के सही कार्यान्वयन को खोजने के लिए कह सकता हूं? क्या मुझे उत्पाद कार्यान्वयन की पहचान करने वाले उत्पाद और आईएटीपी इंटरफेस पर एक सामान्य पैरामीटर का उपयोग करना चाहिए? क्या मुझे उत्पाद कार्यान्वयन की पहचान करने वाले वर्गों पर Productable
कार्यात्मक इंटरफ़ेस का उपयोग करना चाहिए? मैं जैक्सन को उस कार्यान्वयन का उपयोग करने के लिए कैसे कह सकता हूं?
मुझे आशा है कि नीचे दिया गया कोड समस्या को स्पष्ट करता है, मैंने Productable
इंटरफ़ेस को कार्यान्वित करना चुना है, लेकिन इस समस्या को संभालने के लिए एक बेट्टेयर संरचना का भी स्वागत किया जाएगा।
@JsonPropertyOrder({"type", "someInfo"})
public class InsuredAmount implements Productable, Serializable {
private static final long serialVersionUID = 1L;
private IAType type;
private String someInfo;
public InsuredAmount() {
}
public InsuredAmount(IAType typeA, String someInfo) {
this.type = typeA;
this.someInfo = someInfo;
}
/* This should be on the product level, but if I can solve this problem,
the next level will just be more of the same.
*/
@JsonIgnore
@Override
public Product getProduct() {
return Product.PROD_A;
}
// Getters, setters, equals, etc. omitted.
}
-
public interface Productable {
public Product getProduct();
}
-
public enum Product {
PROD_A, PROD_B;
}
-
@JsonDeserialize(using = IATypeDeserializer.class)
public interface IAType extends Productable {
}
-
public enum IATypeA implements IAType {
FOO, BAR;
@Override
public Product getProduct() {
return Product.PROD_A;
}
}
-
public class IATypeDeserializer extends StdDeserializer<IAType> {
private static final long serialVersionUID = 1L;
public IATypeDeserializer() {
this(null);
}
public IATypeDeserializer(Class<?> vc) {
super(vc);
}
@Override
public IAType deserialize(JsonParser parser, DeserializationContext context)
throws IOException, JsonProcessingException {
JsonNode node = parser.getCodec().readTree(parser);
/* How to find out that the class calling the deserialization is InsuredAmountA, which
has getProduct() method that returns PROD_A, and matches the IATypeA that also returns
PROD_A, so I know to deserialize IATypeA, instead of other implementations of the IAType
interface?
*/
return IATypeA.valueOf(node.asText());
}
}
-
public class InsuredAmountTest {
private final ObjectMapper mapper = new ObjectMapper();
@Test
public void test01() throws IOException {
InsuredAmount iaA = new InsuredAmount(IATypeA.FOO, "test it");
String json = mapper.writeValueAsString(iaA);
assertThat(json, is("{\"type\":\"FOO\",\"someInfo\":\"test it\"}"));
InsuredAmount iaA2 = mapper.readValue(json, InsuredAmount.class);
IAType type = iaA2.getType();
assertThat(type, is(IATypeA.FOO));
assertThat(type.getProduct(), is(Product.PROD_A));
assertThat(iaA, is(iaA2));
}
@Test
public void test02() throws IOException {
InsuredAmount iaA = new InsuredAmount(IATypeA.BAR, "test it");
String json = mapper.writeValueAsString(iaA);
assertThat(json, is("{\"type\":\"BAR\",\"someInfo\":\"test it\"}"));
InsuredAmount iaA2 = mapper.readValue(json, InsuredAmount.class);
assertThat(iaA, is(iaA2));
}
}
हाँ, मैंने पहले ही उसमें देखा है। यह पता नहीं लगा सका कि मेरे मामले में इसका उपयोग कैसे किया जाए। –
@JsonTypeResolver आपको आवश्यक एनोटेशन लगता है, मैं स्रोतों (जैक्सन कोड का एक अच्छा टुकड़ा है और समझने में आसान है) देखता हूं और तातो सलोरांटा को परेशान करता है, वह लेखक है - वह आमतौर पर ज़िम्मेदार है और पश्चिमी तट में कहीं रहता है –