[ 
https://issues.apache.org/jira/browse/AVRO-2775?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17061014#comment-17061014
 ] 

Andy Le commented on AVRO-2775:
-------------------------------

I also think we should refactor JacksonUtils to clean it a little bit.

For example, currently we have:

 
{code:java}
public static Object toObject(JsonNode jsonNode, Schema schema) {
  if (schema != null && schema.getType().equals(Schema.Type.UNION)) {
    return toObject(jsonNode, schema.getTypes().get(0));
  }
  if (jsonNode == null) {
    return null;
  } else if (jsonNode.isNull()) {
    return JsonProperties.NULL_VALUE;
  } else if (jsonNode.isBoolean()) {
    return jsonNode.asBoolean();
  }
  //. ..
}
{code}
 
We can have a better code the above:

{code:java}
public static Object toObject(JsonNode jsonNode, Schema schema) {
  if (schema != null && schema.getType().equals(Schema.Type.UNION)) {
    return toObject(jsonNode, schema.getTypes().get(0));
  }
  
  if (jsonNode == null) {
    return null;
  } 
  
  if (jsonNode.isNull()) {
    return JsonProperties.NULL_VALUE;
  } 
  
  if (jsonNode.isBoolean()) {
    return jsonNode.asBoolean();
  }

  // ..
}
{code}

[~sekikn] do you think it's worth to refactor such code?

> JacksonUtils: exception when calling toJsonNode() 
> --------------------------------------------------
>
>                 Key: AVRO-2775
>                 URL: https://issues.apache.org/jira/browse/AVRO-2775
>             Project: Apache Avro
>          Issue Type: Bug
>          Components: java
>    Affects Versions: 1.9.2
>            Reporter: Andy Le
>            Priority: Major
>
> I've got a simple test as followed
> {code:java}
> public class TestJacksonUtils {
>   public static class Age{
>     public int value = 9;
>   }
>   @Test
>   public void testToJson(){
>     Map<String, Object> kv = new HashMap<>();
>     kv.put("age", 9);
>     JsonNode node1 = JacksonUtils.toJsonNode(kv); // -> This is OK
>     Object obj = new Age();
>     JsonNode node2 = JacksonUtils.toJsonNode(obj); // -> This will trigger an 
> exception
>   }
> }
> {code}
> When I ran the test:
> {noformat}
> org.apache.avro.AvroRuntimeException: Unknown datum class: class 
> org.apache.avro.util.internal.TestJacksonUtils$Age
>       at 
> org.apache.avro.util.internal.JacksonUtils.toJson(JacksonUtils.java:87)
>       at 
> org.apache.avro.util.internal.JacksonUtils.toJsonNode(JacksonUtils.java:48)
>       at 
> org.apache.avro.util.internal.TestJacksonUtils.testToJson(TestJacksonUtils.java:20)
> {noformat}
> I've read the code & tests for JacksonUtils. Instead of raising exceptions at 
> [line 
> #87|https://github.com/apache/avro/blob/master/lang/java/avro/src/main/java/org/apache/avro/util/internal/JacksonUtils.java#L87],
>  I see we can auto convert objects into maps, every thing's gonna fine.
> My question is:
> - Is raising exception acceptable?
> - Any other way to have `toJsonNode` for general objects?



--
This message was sent by Atlassian Jira
(v8.3.4#803005)

Reply via email to