On Thu, Dec 20, 2018 at 1:28 PM matt Smith <[email protected]> wrote:
>
> I added as comments beside each line in the else block below. that is what I
> expect it to work. is my expectation in any of those lines?
Almost right, with one incorrect one:
>
> if (items.isEmpty()) {
> jgen.writeStartObject();
> jgen.writeFieldName(id);
> jgen.writeStartArray();
> jgen.writeEndArray();
> jgen.writeEndObject();
> }
> else {
> jgen.writeStartObject(); // '{'
> Object item = items.get(0);
> jgen.writeFieldName(id); //"combined"
> if (item instanceof ItemRow){
> for (Object i : items) {
> jgen.writeStartObject(); // "{"
> jgen.writeObject(i); // "abc"
> :["item1","item2", "item2"]
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^'
"abc" is not output -- you are asking for value `i` to be serialized as a value.
Not as property-name/value pair.
So if you expect "abc" in there, you need to call `writeFieldName("abc")`
-+ Tatu +-
> jgen.writeEndObject(); // "}"
>
>
>
> On Thursday, December 20, 2018 at 11:32:55 AM UTC-8, matt Smith wrote:
>>
>> here is the class that I want to serialize.
>>
>>
>> public class ItemRow<T> {
>>
>> private String id;
>> private List<T> items;
>> }
>>
>>
>> There are two variations that are allowed.
>>
>> `ItemRow<String>, ItemRow<ItemRow>`.
>>
>> In the latter case, it will be nested.
>>
>> eg:
>>
>>
>> ItemRow item1 = new ItemRow("abc", Arrays.asList("item1", "item2",
>> "item3"));
>> String result = mapper.writeValueAsString(item1);
>> System.out.println(result);
>>
>>
>>
>> should give
>>
>>
>> {"abc":["item1","item2","item3"]}
>>
>>
>>
>> Now, the latter case
>>
>>
>> ItemRow item2 = new ItemRow("cde", Arrays.asList("item4, item5"));
>> ItemRow item = new ItemRow("combined", Arrays.asList(item1,item2));
>> result = mapper.writeValueAsString(item);
>> System.out.println(result);
>>
>>
>> should give
>>
>>
>> {
>> "combined": {
>> "abc": ["item1", "item2", "item3"],
>> "cde": ["item4", "item5"]
>> }
>> }
>>
>>
>> But I get exception while serializing the latter. The first one works as
>> expected. so I believe the recursive serialization is failing, but I am
>> unable to find out why
>>
>> Here is exception
>>
>>
>> com.fasterxml.jackson.core.JsonGenerationException: Can not start an
>> object, expecting field name (context: Object)
>>
>> at
>> com.fasterxml.jackson.core.JsonGenerator._reportError(JsonGenerator.java:1961)
>> at
>> com.fasterxml.jackson.core.json.JsonGeneratorImpl._reportCantWriteValueExpectName(JsonGeneratorImpl.java:244)
>> at
>> com.fasterxml.jackson.core.json.WriterBasedJsonGenerator._verifyValueWrite(WriterBasedJsonGenerator.java:866)
>> at
>> com.fasterxml.jackson.core.json.WriterBasedJsonGenerator.writeStartObject(WriterBasedJsonGenerator.java:279)
>> at hello.ItemRowSerializer.serialize(ItemRow.java:58)
>> at hello.ItemRowSerializer.serialize(ItemRow.java:42)
>> at
>> com.fasterxml.jackson.databind.ser.DefaultSerializerProvider._serialize(DefaultSerializerProvider.java:480)
>> at
>> com.fasterxml.jackson.databind.ser.DefaultSerializerProvider.serializeValue(DefaultSerializerProvider.java:319)
>> at
>> com.fasterxml.jackson.databind.ObjectMapper.writeValue(ObjectMapper.java:2655)
>> at
>> com.fasterxml.jackson.core.base.GeneratorBase.writeObject(GeneratorBase.java:381)
>> at hello.ItemRowSerializer.serialize(ItemRow.java:67)
>> at hello.ItemRowSerializer.serialize(ItemRow.java:42)
>>
>>
>> Serializer implementation
>>
>>
>> class ItemRowSerializer extends JsonSerializer<ItemRow> {
>>
>> @Override
>> public void serialize(ItemRow itemRow, JsonGenerator jgen,
>> SerializerProvider serializerProvider) throws IOException {
>>
>> String id = itemRow.getId();
>> List<Object> items = itemRow.getItems();
>>
>> if (items.isEmpty()) {
>> jgen.writeStartObject();
>> jgen.writeFieldName(id);
>> jgen.writeStartArray();
>> jgen.writeEndArray();
>> jgen.writeEndObject();
>> }
>> else {
>> jgen.writeStartObject();
>> Object item = items.get(0);
>> jgen.writeFieldName(id);
>> if (item instanceof ItemRow){
>> for (Object i : items) {
>> //ItemRow temp = (ItemRow) i;
>> //jgen.writeObjectField(temp.getId(), temp);
>> //jgen.writeObjectField(id, i);
>> jgen.writeStartObject();
>> jgen.writeObject(i);
>> jgen.writeEndObject();
>> }
>> }
>> else {
>> //jgen.writeFieldName(id);
>> jgen.writeStartArray();
>> for (Object arg : items) {
>> jgen.writeString(arg.toString());
>> }
>> jgen.writeEndArray();
>> }
>> }
>> jgen.writeEndObject();
>> }
>> }
>>
>>
>>
>>
>>
>>
>>
> --
> You received this message because you are subscribed to the Google Groups
> "jackson-user" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to [email protected].
> To post to this group, send email to [email protected].
> For more options, visit https://groups.google.com/d/optout.
--
You received this message because you are subscribed to the Google Groups
"jackson-user" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To post to this group, send email to [email protected].
For more options, visit https://groups.google.com/d/optout.