代码之家  ›  专栏  ›  技术社区  ›  LuDev

JSON反序列化器与使用HashMap的GSON

  •  -1
  • LuDev  · 技术社区  · 8 年前

    我正在尝试使用GSON反序列化JSON数据,并帮助自己使用 HashMap<> 但是,当我将json字符串设置到java类中时,出现了一个错误,应用程序只是停止,并用错误的来源标记行:

    funt = gson.fromJson(String.valueOf(R.string.json), stack.class);
    

    注意:我正在尝试获取json数据以放入自定义适配器中,下面是代码:

    1个问题 :I´m是否正确获取json字符串并将其设置到java类中?

    2问题 :Im是否正确映射标识符? (我使用的“identifier”有类名,因为我不能为每个项目创建一个each类,这就是我需要映射的原因)如果没有,你能告诉我怎么做吗?

    Java类,我试图在其中放置json字符串:

    public class stack {
        private int id;
        private String name;
        private UserBean user;
        private ItemsBean items;
        public int getId() {
            return id;
        }
        public void setId(int id) {
            this.id = id;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public UserBean getUser() {
            return user;
        }
    
        public void setUser(UserBean user) {
            this.user = user;
        }
    
        public ItemsBean getItems() {
            return items;
        }
    
        public void setItems(ItemsBean items) {
            this.items = items;
        }
    
        public static class UserBean {
            private String name;
    
            public String getName() {
                return name;
            }
    
            public void setName(String name) {
                this.name = name;
            }
        }
    
        public static class ItemsBean {
    
            private HashMap<String, IdentifierBean> identifier;
    
            public HashMap<String, IdentifierBean> getIdentifier(){
                return identifier;
            }
    
            public void setIdentifier(HashMap<String,IdentifierBean> identifier){
                this.identifier = identifier;
               }
    
            public static class IdentifierBean {
                private int id;
                private int strong;
                private boolean active;
                private String sell;
    
                public int getId() {return id;}
    
                public void setId(int id) {this.id = id; }
    
                public int getStrong() {return strong;}
    
                public void setStrong(int strong) {this.strong = strong;}
    
                public boolean isActive() {return active;}
    
                public void setActive(boolean active) {this.active = active;}
    
                public String getSell() {return sell;}
    
                public void setSell(String sell) {this.sell = sell;}
            }
        }
    }
    

    以下是活动类:

    public class stacker extends AppCompatActivity {
        stack funt;
        Gson gson;
        adapterstack adapter;
        ListView list;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_stacker);
            list = (ListVeew)findViewById(R.id.listss);
    
            gson = new Gson();
            funt = gson.fromJson(String.valueOf(R.string.json), stack.class);
            adapter = new adapterstack(stacker.this, (List<stack.ItemsBean>) funt.getItems());
            list.setAdapter(adapter);
        }
    }
    

    这是适配器:

    public class adapterstack extends BaseAdapter {
        List<stack.ItemsBean> itemlist;
        Context sContext;
        public adapterstack( Context sContext, List<stack.ItemsBean> itemlist) {
            this.sContext = sContext;
            this.itemlist = itemlist;}
        @Override
        public int getCount() {return itemlist.size();}
    
        @Override
        public Object getItem(int i) {return itemlist.get(i);}
    
        @Override
        public long getItemId(int i) {return i;}
    
        @Override
        public View getView(int i, View view, ViewGroup viewGroup) {
            LayoutInflater inflater = (LayoutInflater) sContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            final View rootView = inflater.inflate(R.layout.item_act, viewGroup, false);
            final stack.ItemsBean item = (stack.ItemsBean) getItem(i);
            TextView nombre = (TextView) rootView.findViewById(R.id.txt1);
            TextView genero = (TextView) rootView.findViewById(R.id.txt2);
    
            //Here i'm trying to get identifier data info from stack.class
    
            nombre.setText(item.getIdentifier().get(i).getId());
            genero.setText(item.getIdentifier().get(i).getStrong());
            return rootView;
        }
    }
    

    JSON:

    [{
    "id": 1001,
    "name": "Super1",
    "user": {
        "name": "The Super 1"
    },
    "items": {
        "987987M7812b163eryrt": {
            "id": 1,
            "strong": 456,
            "active": true,
            "sell": "te"
        },
        "90812bn120893juuh": {
            "id": 2,
            "strong": 4700,
            "active": true,
            "sell": "tt"
        },
        "981273jn19203nj123rg": {
            "id": 3,
            "strong": 3000,
            "active": true,
            "sell": "ti"
        }
    }}]
    
    1 回复  |  直到 8 年前
        1
  •  1
  •   Reaz Murshed vir us    8 年前

    我看到您试图解析的JSON字符串表示一个数组。在这种情况下,您需要如下解析JSON。

    funt = gson.fromJson(String.valueOf(R.string.json), stack[].class);
    

    希望有帮助!