2015-11-11 6 views
2

Привет всем, извините, мой язык плохой!Как получить название поля класса в java

Это мой код:

MyCustomClass temp = new MyCustomClass(); 
for (int i = 0; i < jsonarray.length(); i++) { 
    JSONObject obj = jsonarray.getJSONObject(i); 
    temp.ID = obj.getInt("ID"); 
    temp.PicName = obj.getString("PicName"); 
    temp.PicURL = obj.getString("PicURL"); 
    Items.add(temp); 
} 

Я хотел бы воспользоваться этой динамичной

Что-то вроде этого

MyCustomClass temp = new MyCustomClass(); 
Field[] myFields= MyCustomClass.class.getFields(); 
for (int i = 0; i < jsonarray.length(); i++) { 
    JSONObject obj = jsonarray.getJSONObject(i); 
    for(int j=0;j<myFields.lenghth();j++) 
    { 
     myFields[j]=obj.getString(myFields[j].toString()); 
     Items.add(temp); 
    } 
} 

Как это сделать?

* Название Джейсон полей = Имя MyCustomClass Поле

+2

Вы можете использовать библиотеку 'Gson' вместо' json-simple'. 'Gson' может конвертировать строки JSON в объекты Java, а наоборот – Titus

+2

Вы используете библиотеку json, например' jackson'?С помощью джексона вы можете настроить «MyCustomClass» Pojo с аннотациями и какие поля должны быть проанализированы. – Patrick

+1

Помогает ли вам любой из ответов? – Patrick

ответ

3

Jackson и Gson сделают все это для вас.

static class TestClass { 
    public int id; 
    public String name; 
} 

@Test 
public void gson() { 
    Gson gson = new Gson(); 
    TestClass[] item = gson.fromJson("[{'id': 1, 'name': 'testclass'}]", TestClass[].class); 
    assertThat(item[0].id, is(1)); 
    assertThat(item[0].name, is("testclass")); 
    assertThat(item.length, is(1)); 
} 

@Test 
public void jackson() throws IOException { 
    ObjectMapper jacksonObjectMapepr = new ObjectMapper(); 
    TestClass[] item = jacksonObjectMapepr.readValue("[{\"id\": 1, \"name\": \"testclass\"}]", TestClass[].class); 
    assertThat(item[0].id, is(1)); 
    assertThat(item[0].name, is("testclass")); 
    assertThat(item.length, is(1)); 
} 

Однако, чтобы ответить на ваш вопрос, вы можете посмотреть, что каждое поле с getDeclaredField. Но вам нужно будет выполнить некоторую работу, чтобы обрабатывать все типы отображения.

@Test 
public void sillyWayIDontRecommend() throws NoSuchFieldException, IllegalAccessException { 
    TestClass[] item = new TestClass[1]; 

    JsonArray array = new JsonParser().parse("[{\"id\": 1, \"name\": \"testclass\"}]").getAsJsonArray(); 
    for(int i = 0; i<array.size(); i++) { 
     item[i] = new TestClass(); 

     JsonObject object = array.get(i).getAsJsonObject(); 
     for(Map.Entry<String, JsonElement> entry : object.entrySet()) { 
      Field field = TestClass.class.getDeclaredField(entry.getKey()); 
      if(field.getType().equals(int.class)) { 
       field.setInt(item[i], entry.getValue().getAsInt()); 
      } else { 
       field.set(item[i], entry.getValue().getAsString()); 
      } 
     } 
    } 

    assertThat(item[0].id, is(1)); 
    assertThat(item[0].name, is("testclass")); 
    assertThat(item.length, is(1)); 
} 
1

Вы можете получить все поля класса с этой конструкцией:

Class class = ...//obtain class object 
Field[] methods = class.getFields(); 

С вашим классом это:

MyCustomClass temp = new MyCustomClass(); 
Field[] methods = temp.getFields(); 
2

С библиотекой Джексона вы можете настроить свои Pojos напрямую с помощью аннотаций json, и вы можете напрямую конвертировать строки JSON в объекты Java.

Общий способ для синтаксического анализа может быть что-то вроде этого:

public static <T> T deserialize(T t, Class<T> clazz, String json) throws JsonParseException, JsonMappingException, IOException{ 
     ObjectMapper mapper = new ObjectMapper(); 
     return mapper.readValue(json, clazz); 
    } 

T - это ваш объект и тип возвращаемого значения

clazz - Ваш Pojo

json - это ваш JSON Строка

Вы можете вызвать метод как это:

MyCustomClass myCustomClass= new MyCustomClass(); 
myCustomClass= JsonUtil.deserialize(myCustomClass, MyCustomClass.class, json); 

Ваш Pojo может выглядеть следующим образом:

@JsonIgnoreProperties // ignores properties from json String which are not in your Pojo 
public class MyCustomClass { 

    @JsonProperty("anotherNameIfFieldNameIsNotEqual") 
    private String picName; 
    private String picURL; 

    public String getPicName() { 
     return picName; 
    } 
    public void setPicName(String picName) { 
     this.picName = picName; 
    } 
    public String getPicURL() { 
     return picURL; 
    } 
    public void setPicURL(String picURL) { 
     this.picURL= picURL; 
    } 
} 

И это Maven зависимость вам нужно:

<dependency> 
    <groupId>com.fasterxml.jackson.core</groupId> 
    <artifactId>jackson-databind</artifactId> 
    <version>2.6.3</version> 
</dependency> 

Documentation и Example

Смежные вопросы