On Thu, Dec 20, 2018 at 1:28 PM matt Smith <matt.smith.11...@gmail.com> 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 jackson-user+unsubscr...@googlegroups.com.
> To post to this group, send email to jackson-user@googlegroups.com.
> 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 jackson-user+unsubscr...@googlegroups.com.
To post to this group, send email to jackson-user@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to