• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 package com.fasterxml.jackson.databind.node;
2 
3 import java.io.IOException;
4 
5 import com.fasterxml.jackson.core.*;
6 import com.fasterxml.jackson.databind.JsonNode;
7 import com.fasterxml.jackson.databind.JsonSerializable;
8 import com.fasterxml.jackson.databind.SerializerProvider;
9 import com.fasterxml.jackson.databind.jsontype.TypeSerializer;
10 
11 /**
12  * Abstract base class common to all standard {@link JsonNode}
13  * implementations.
14  * The main addition here is that we declare that sub-classes must
15  * implement {@link JsonSerializable}.
16  * This simplifies object mapping aspects a bit, as no external serializers are needed.
17  *<p>
18  * Since 2.10, all implements have been {@link java.io.Serializable}.
19  */
20 public abstract class BaseJsonNode
21     extends JsonNode
22     implements java.io.Serializable
23 {
24     private static final long serialVersionUID = 1L;
25 
26     // Simplest way is by using a helper
writeReplace()27     Object writeReplace() {
28         return NodeSerialization.from(this);
29     }
30 
BaseJsonNode()31     protected BaseJsonNode() { }
32 
33     /*
34     /**********************************************************
35     /* Basic definitions for non-container types
36     /**********************************************************
37      */
38 
39     @Override
findPath(String fieldName)40     public final JsonNode findPath(String fieldName)
41     {
42         JsonNode value = findValue(fieldName);
43         if (value == null) {
44             return MissingNode.getInstance();
45         }
46         return value;
47     }
48 
49     // Also, force (re)definition (2.7)
hashCode()50     @Override public abstract int hashCode();
51 
52     /*
53     /**********************************************************************
54     /* Improved required-ness checks for standard JsonNode implementations
55     /**********************************************************************
56      */
57 
58     @Override
required(String fieldName)59     public JsonNode required(String fieldName) {
60         return _reportRequiredViolation("Node of type `%s` has no fields",
61                 getClass().getSimpleName());
62     }
63 
64     @Override
required(int index)65     public JsonNode required(int index) {
66         return _reportRequiredViolation("Node of type `%s` has no indexed values",
67                 getClass().getSimpleName());
68     }
69 
70     /*
71     /**********************************************************
72     /* Support for traversal-as-stream
73     /**********************************************************
74      */
75 
76     @Override
traverse()77     public JsonParser traverse() {
78         return new TreeTraversingParser(this);
79     }
80 
81     @Override
traverse(ObjectCodec codec)82     public JsonParser traverse(ObjectCodec codec) {
83         return new TreeTraversingParser(this, codec);
84     }
85 
86     /**
87      * Method that can be used for efficient type detection
88      * when using stream abstraction for traversing nodes.
89      * Will return the first {@link JsonToken} that equivalent
90      * stream event would produce (for most nodes there is just
91      * one token but for structured/container types multiple)
92      */
93     @Override
asToken()94     public abstract JsonToken asToken();
95 
96     /**
97      * Returns code that identifies type of underlying numeric
98      * value, if (and only if) node is a number node.
99      */
100     @Override
numberType()101     public JsonParser.NumberType numberType() {
102         // most types non-numeric, so:
103         return null;
104     }
105 
106     /*
107     /**********************************************************
108     /* JsonSerializable
109     /**********************************************************
110      */
111 
112     /**
113      * Method called to serialize node instances using given generator.
114      */
115     @Override
serialize(JsonGenerator jgen, SerializerProvider provider)116     public abstract void serialize(JsonGenerator jgen, SerializerProvider provider)
117         throws IOException, JsonProcessingException;
118 
119     /**
120      * Type information is needed, even if JsonNode instances are "plain" JSON,
121      * since they may be mixed with other types.
122      */
123    @Override
serializeWithType(JsonGenerator jgen, SerializerProvider provider, TypeSerializer typeSer)124     public abstract void serializeWithType(JsonGenerator jgen, SerializerProvider provider,
125             TypeSerializer typeSer)
126         throws IOException, JsonProcessingException;
127 
128    /*
129    /**********************************************************
130    /* Standard method overrides
131    /**********************************************************
132     */
133 
134    @Override
toString()135    public String toString() {
136        return InternalNodeMapper.nodeToString(this);
137    }
138 
139    @Override
toPrettyString()140    public String toPrettyString() {
141        return InternalNodeMapper.nodeToPrettyString(this);
142    }
143 }
144 
145