有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

json如何在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);
    }
}

怎么做

*jason字段的名称=MycustomClass字段的名称


共 (3) 个答案

  1. # 1 楼答案

    使用此结构可以获得所有类字段:

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

    在你的课堂上:

    MyCustomClass temp = new MyCustomClass();
    Field[] methods = temp.getFields();
    
  2. # 2 楼答案

    使用jackson库,您可以直接使用json注释设置POJO,并且可以将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是你的工作重点吗

    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>
    

    DocumentationExample

  3. # 3 楼答案

    JacksonGson将为您完成所有这些

    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));
    }
    

    然而,为了回答您的问题,您可以用^{}查找每个字段。但是,要处理所有类型映射,您必须做相当多的工作

    @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));
    }