मेरे पास दो जावा कक्षाएं हैं जिन्हें मैं जैक्सन को जैक्सन का उपयोग करके क्रमबद्ध करना चाहता हूं:
public class User {
public final int id;
public final String name;
public User(int id, String name) {
this.id = id;
this.name = name;
}
}
public class Item {
public final int id;
public final String itemNr;
public final User createdBy;
public Item(int id, String itemNr, User createdBy) {
this.id = id;
this.itemNr = itemNr;
this.createdBy = createdBy;
}
}
मैं इस JSON के लिए एक आइटम क्रमबद्ध करना चाहता हूं:
{"id":7, "itemNr":"TEST", "createdBy":3}
उपयोगकर्ता के साथ क्रमबद्ध केवल शामिल करने के लिए id। मैं भी JSON की तरह सभी उपयोगकर्ता वस्तुओं को व्यवस्थित करने में सक्षम हो जाएगा:
{"id":3, "name": "Jonas", "email": "jonas@example.com"}
इसलिए मुझे लगता है कि मुझे इसके लिए एक कस्टम धारावाहिक लिखने की ज़रूरत है Itemऔर इसके साथ प्रयास करने की आवश्यकता है :
public class ItemSerializer extends JsonSerializer<Item> {
@Override
public void serialize(Item value, JsonGenerator jgen,
SerializerProvider provider) throws IOException,
JsonProcessingException {
jgen.writeStartObject();
jgen.writeNumberField("id", value.id);
jgen.writeNumberField("itemNr", value.itemNr);
jgen.writeNumberField("createdBy", value.user.id);
jgen.writeEndObject();
}
}
मैं जैक्सन को जैक्सन-टू से इस कोड के साथ क्रमबद्ध करता हूं : कस्टम सीरियल :
ObjectMapper mapper = new ObjectMapper();
SimpleModule simpleModule = new SimpleModule("SimpleModule",
new Version(1,0,0,null));
simpleModule.addSerializer(new ItemSerializer());
mapper.registerModule(simpleModule);
StringWriter writer = new StringWriter();
try {
mapper.writeValue(writer, myItem);
} catch (JsonGenerationException e) {
e.printStackTrace();
} catch (JsonMappingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
लेकिन मुझे यह त्रुटि मिली:
Exception in thread "main" java.lang.IllegalArgumentException: JsonSerializer of type com.example.ItemSerializer does not define valid handledType() (use alternative registration method?)
at org.codehaus.jackson.map.module.SimpleSerializers.addSerializer(SimpleSerializers.java:62)
at org.codehaus.jackson.map.module.SimpleModule.addSerializer(SimpleModule.java:54)
at com.example.JsonTest.main(JsonTest.java:54)
मैं जैक्सन के साथ एक कस्टम Serializer का उपयोग कैसे कर सकता हूं?
इस तरह से मैं इसे Gson के साथ करूंगा:
public class UserAdapter implements JsonSerializer<User> {
@Override
public JsonElement serialize(User src, java.lang.reflect.Type typeOfSrc,
JsonSerializationContext context) {
return new JsonPrimitive(src.id);
}
}
GsonBuilder builder = new GsonBuilder();
builder.registerTypeAdapter(User.class, new UserAdapter());
Gson gson = builder.create();
String json = gson.toJson(myItem);
System.out.println("JSON: "+json);
लेकिन मुझे इसे अब जैक्सन के साथ करने की आवश्यकता है, क्योंकि गॉन के पास इंटरफेस के लिए समर्थन नहीं है।
Item? मैं एक समस्या है जहाँ मेरे नियंत्रक विधि एक मानक क्रमांकित वस्तु देता हैTypeA, लेकिन एक और विशिष्ट नियंत्रक विधि के लिए, मैं इसे अलग तरह से क्रमबद्ध करना चाहता हूँ। वो कैसा लगता है?