2012-04-24 23 views
26

के उत्पादन में बदलने के लिए मैं इस enum है:Gson: Enum

enum RequestStatus { 
    OK(200), NOT_FOUND(400); 

    private final int code; 

    RequestStatus(int code) { 
    this.code = code; 
    } 

    public int getCode() { 
    return this.code; 
    } 
}; 

और मेरे अनुरोध श्रेणी में, मैं इस क्षेत्र है: private RequestStatus status

Gson का उपयोग करते समय JSON करने के लिए जावा वस्तु कन्वर्ट करने के लिए परिणाम की तरह है:

"status": { 
    "value" : "OK", 
    "code" : 200 
} 

उत्तर

18

:

"status": "OK" 

मैं अपने GsonBuilder या मेरे Enum वस्तु मेरे जैसे एक आउटपुट देने के लिए कैसे बदल सकता हूँ

GsonBuilder builder = new GsonBuilder(); 
builder.registerTypeAdapterFactory(new MyEnumAdapterFactory()); 

या अधिक बस (के रूप में जेसी विल्सन इंगित):: आप कुछ इस तरह उपयोग कर सकते हैं

GsonBuilder builder = new GsonBuilder(); 
builder.registerTypeAdapter(RequestStatus.class, new MyEnumTypeAdapter()); 

और

public class MyEnumAdapterFactory implements TypeAdapterFactory { 

    @Override 
    public <T> TypeAdapter<T> create(final Gson gson, final TypeToken<T> type) { 
      Class<? super T> rawType = type.getRawType(); 
      if (rawType == RequestStatus.class) { 
       return new MyEnumTypeAdapter<T>(); 
      } 
      return null; 
    } 

    public class MyEnumTypeAdapter<T> extends TypeAdapter<T> { 

     public void write(JsonWriter out, T value) throws IOException { 
       if (value == null) { 
        out.nullValue(); 
        return; 
       } 
       RequestStatus status = (RequestStatus) value; 
       // Here write what you want to the JsonWriter. 
       out.beginObject(); 
       out.name("value"); 
       out.value(status.name()); 
       out.name("code"); 
       out.value(status.getCode()); 
       out.endObject(); 
     } 

     public T read(JsonReader in) throws IOException { 
       // Properly deserialize the input (if you use deserialization) 
       return null; 
     } 
    } 

} 
+0

@ डेनिस मैडसन यहां मैंने इसे कोड की आंतरिक कक्षा के रूप में रखा है। क्या आपको याद आया या मुझे आपका प्रश्न समझ में नहीं आया? –

+0

धन्यवाद। क्या आप मुझे एक उदाहरण दे सकते हैं, मैं लिखने की विधि में * जेसनवाइटर * कैसे बदल सकता हूं? – dhrm

+0

@DennisMadsen मैंने कुछ नमूना कोड जोड़ा जो मुझे लगता है कि आप जो कुछ भी ढूंढ रहे हैं वह काफी है। –

2

Polet के जवाब के अलावा, यदि आप एक सामान्य Enum serializer जरूरत है, तो आप इसे प्रतिबिंब के माध्यम से प्राप्त कर सकते हैं:

public class EnumAdapterFactory implements TypeAdapterFactory 
{ 

    @Override 
    public <T> TypeAdapter<T> create(final Gson gson, final TypeToken<T> type) 
    { 
     Class<? super T> rawType = type.getRawType(); 
     if (rawType.isEnum()) 
     { 
      return new EnumTypeAdapter<T>(); 
     } 
     return null; 
    } 

    public class EnumTypeAdapter<T> extends TypeAdapter<T> 
    { 
     @Override 
     public void write(JsonWriter out, T value) throws IOException 
     { 
      if (value == null || !value.getClass().isEnum()) 
      { 
       out.nullValue(); 
       return; 
      } 

      try 
      { 
       out.beginObject(); 
       out.name("value"); 
       out.value(value.toString()); 
       Arrays.stream(Introspector.getBeanInfo(value.getClass()).getPropertyDescriptors()) 
         .filter(pd -> pd.getReadMethod() != null && !"class".equals(pd.getName()) && !"declaringClass".equals(pd.getName())) 
         .forEach(pd -> { 
          try 
          { 
           out.name(pd.getName()); 
           out.value(String.valueOf(pd.getReadMethod().invoke(value))); 
          } catch (IllegalAccessException | InvocationTargetException | IOException e) 
          { 
           e.printStackTrace(); 
          } 
         }); 
       out.endObject(); 
      } catch (IntrospectionException e) 
      { 
       e.printStackTrace(); 
      } 
     } 

     public T read(JsonReader in) throws IOException 
     { 
      // Properly deserialize the input (if you use deserialization) 
      return null; 
     } 
    } 
} 

उपयोग:

@Test 
public void testEnumGsonSerialization() 
{ 
    List<ReportTypes> testEnums = Arrays.asList(YourEnum.VALUE1, YourEnum.VALUE2); 
    GsonBuilder builder = new GsonBuilder(); 
    builder.registerTypeAdapterFactory(new EnumAdapterFactory()); 
    Gson gson = builder.create(); 
    System.out.println(gson.toJson(reportTypes)); 
} 
+1

यह अच्छा है लेकिन देखो, यह एनम के खेतों में नहीं, गेटर्स को क्रमबद्ध करता है। –