2013-02-19 36 views
5

lớp của tôi:Làm thế nào để ngăn chặn Gson serialize/deserialize ký tự đầu tiên của một trường (gạch dưới)?

class ExampleBean { 
    private String _firstField; 
    private String _secondField; 
    // respective getters and setters 
} 

Tôi muốn xuất hiện như sau:

{ 
    "FirstField":"value", 
    "SecondField":"value" 
} 

Và không như thế này

{ 
    "_FirstField":"value", 
    "_SecondField":"value" 
} 

tôi khởi tạo phân tích cú pháp như sau:

GsonBuilder builder = new GsonBuilder(); 
    builder.setDateFormat(DateFormat.LONG); 
    builder.setFieldNamingPolicy(FieldNamingPolicy.UPPER_CAMEL_CASE); 
    builder.setPrettyPrinting(); 
    set_defaultParser(builder.create()); 

Tôi có thể thấy API và trong documentation của "FieldNamePolicy" nhưng tôi ngạc nhiên là không cung cấp tùy chọn để bỏ qua "_" Tôi cũng biết tôi có thể sử dụng các chú thích ...

@ SerializedName (" custom_naming ") 

... nhưng không muốn phải viết điều này cho alllllll các lĩnh vực của tôi ...

Nó rất hữu ích cho tôi để phân biệt giữa các biến địa phương và các trường của một lớp. :(Bất cứ ý tưởng

EDIT:?. Sẽ có nhiều giải pháp rõ ràng, (thừa kế, phương pháp ghi đè gson, expresions thường xuyên) Câu hỏi của tôi là tập trung hơn vào việc có một giải pháp có nguồn gốc của gson hoặc một sửa chữa ít xâm nhập ?

có lẽ chúng ta có thể đề xuất FieldNamePolicy như mới?

+0

Câu trả lời là ... theo đúng quy ước đặt tên Java và không sử dụng dấu gạch dưới. Và mặc dù các quy ước đặt tên JSON cho phép nó, bạn hiếm khi tìm thấy bất kỳ ai sử dụng PascalCase trong JSON (đó là những gì đầu ra được đề xuất của bạn). Tùy chọn khác của bạn đang sử dụng '@ SerializedName' cho mọi tên trường không khớp. –

+0

Bạn không cho tôi biết bất cứ điều gì tôi không biết. Tôi và nhóm chuyên gia của tôi, chúng tôi tự do lựa chọn các quy ước ngôn ngữ mà chúng tôi đồng ý nhiều hơn. Đặc biệt khi chúng tôi tích hợp nhiều công nghệ và ngôn ngữ khác nhau cùng một lúc. Dù sao, cảm ơn thời gian của bạn. – enagra

+0

Sau đó, bạn và "nhóm chuyên gia" của bạn nên chuẩn bị để đối phó với các vấn đề phát sinh từ đó, eh? Oddly đủ Tôi đã thực sự ở giữa gõ một câu trả lời cho bạn thấy làm thế nào bạn thực sự có thể thực hiện điều này với một tùy chỉnh Gson JsonSerializer sử dụng sự phản ánh khi bạn nhận xét ...nhưng tôi chắc chắn bạn sẽ tìm ra điều đó, với điều kiện bạn có cả đội ngũ chuyên gia ... –

Trả lời

11

GsonBuilder cung cấp một phương pháp setFieldNamingStrategy() cho phép bạn vượt qua FieldNamingStrategy thực hiện của riêng bạn.

Lưu ý rằng điều này thay thế cal l đến setFieldNamingPolicy() - nếu bạn nhìn vào nguồn cho GsonBuilder hai phương pháp này loại trừ lẫn nhau khi chúng đặt cùng một trường nội bộ (FieldNamingPolicy enum FieldNamingStrategy).

public class App 
{ 
    public static void main(String[] args) 
    { 
     Gson gson = new GsonBuilder() 
         .setFieldNamingStrategy(new MyFieldNamingStrategy()) 
         .setPrettyPrinting() 
         .create(); 

     System.out.println(gson.toJson(new ExampleBean())); 
    } 
} 

class ExampleBean 
{ 

    private String _firstField = "first field value"; 
    private String _secondField = "second field value"; 
    // respective getters and setters 
} 

class MyFieldNamingStrategy implements FieldNamingStrategy 
{ 
    public String translateName(Field field) 
    { 
     String fieldName = 
      FieldNamingPolicy.UPPER_CAMEL_CASE.translateName(field); 
     if (fieldName.startsWith("_")) 
     { 
      fieldName = fieldName.substring(1); 
     } 
     return fieldName; 
    } 
} 

Output:

{ 
    "FirstField": "first field value", 
    "SecondField": "second field value" 
} 
+0

cảm ơn bạn brian! Đây thực sự là giải pháp tuyệt vời! – enagra

+0

Tôi đã cố gắng chỉnh sửa để nó biên dịch và hoạt động, nhưng bản chỉnh sửa đã bị từ chối. Không có phương thức translateName() trên FieldNamingPolicy. http://stackoverflow.com/review/suggested-edits/5997458 – Kirby

+0

@Kirby có, kể từ phiên bản 1.3 https://google-gson.googlecode.com/svn/trunk/gson/docs/javadocs/com/google/ gson/FieldNamingStrategy.html – Justin

0

gì bạn muốn là

import java.lang.reflect.Field; 
import java.text.DateFormat; 

import com.google.gson.FieldNamingStrategy; 
import com.google.gson.Gson; 
import com.google.gson.GsonBuilder; 

public class GsonExample { 

    public static void main(String... args) throws Exception { 
     final GsonBuilder builder = new GsonBuilder(); 
     builder.setDateFormat(DateFormat.LONG); 
     builder.setPrettyPrinting(); 
     builder.setFieldNamingStrategy(new FieldNamingStrategy() { 
      @Override 
      public String translateName(Field f) { 
       String fieldName = f.getName(); 
       if(fieldName.startsWith("_") && fieldName.length() > 1) { 
        fieldName = fieldName.substring(1, 2).toUpperCase() + fieldName.substring(2); 
       } 
       return fieldName; 
      } 
     }); 
     final Gson gson = builder.create(); 
     System.out.println(gson.toJson(new ExampleBean("example", "bean"))); 
    } 


    private static class ExampleBean { 
     private final String _firstField; 
     private final String _secondField; 

     private ExampleBean(String _firstField, String _secondField) { 
      this._firstField = _firstField; 
      this._secondField = _secondField; 
     } 
    } 
} 

mà tạo ra

{"FirstField":"example","SecondField":"bean"} 
Các vấn đề liên quan