android - 适用于 Android 的 JSON(Java)
问题描述
JSON 1
{"languages": [
{"name": "DE","flagPath": "flag_de.png"},
{"name": "ENG","flagPath": "flag_engl.png"},
{"name": "ESP","flagPath": "flag_esp.png"},
{"name": "FR","flagPath": "flag_france.png"},
{"name": "IT","flagPath": "flag_ital.png"}
]}
此代码适用于 json 1
public class MainActivity extends AppCompatActivity {
String TAG = MainActivity.class.getSimpleName();
Context context;
GridView gridView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
try {
context = this;
Gson gson = new Gson();
JsonModel model = gson.fromJson(loadJSONFromAssets(), JsonModel.class);
gridView = (GridView) findViewById(R.id.grid_view);
CustomAdapter customAdapter = new CustomAdapter(getApplicationContext(),
model.getItems());
gridView.setAdapter(customAdapter);
} catch (Exception ex) {
Log.e(TAG, ex.getMessage());
}
}
public String loadJSONFromAssets() {
String json = null;
try {
InputStream inputStream = context.getAssets().open("languages.json");
int size = inputStream.available();
byte[] buffer = new byte[size];
inputStream.read(buffer);
inputStream.close();
json = new String(buffer, "UTF-8");
} catch (IOException e) {
e.printStackTrace();
}
return json;}}
此代码适用于 json 1
public class CustomAdapter extends BaseAdapter {
String TAG = CustomAdapter.class.getSimpleName();
Context context;
ArrayList<Language> items;
LayoutInflater inflater;
public CustomAdapter(Context context, ArrayList<Language> data) {
this.context = context;
this.items = data;
inflater = (LayoutInflater.from(context));
}
@Override
public int getCount() {
return items.size();
}
@Override
public Object getItem(int i) {
return null;
}
@Override
public long getItemId(int i) {
return 0;
}
@Override
public View getView(int i, View view, ViewGroup viewGroup) {
view = inflater.inflate(R.layout.grd_view_item, null);
TextView txtName = (TextView) view.findViewById(R.id.type);
ImageView imgPic = (ImageView) view.findViewById(R.id.image);
txtName.setText(items.get(i).getName());
loadImage(imgPic, items.get(i).getFlagPath());
return view;
}
InputStream inputstream;
Drawable drawable;
private void loadImage(ImageView imageView, String imageName) {
try {
inputstream = context.getAssets().open("images/" + imageName);
drawable = Drawable.createFromStream(inputstream, null);
imageView.setImageDrawable(drawable);
} catch (Exception ex) {
Log.e(TAG, ex.getMessage());
}
}
}
现在我遇到了这个 JSON json 2 的问题
{
"languages": {
"1": {
"flagPath": "de.jpg",
"name": "DE"
},
"2": {
"flagPath": "engneu.jpg",
"name": "ENG"
},
"3": {
"flagPath": "France.png",
"name": "FR"
},
"5": {
"flagPath": "Flagge_Italien.jpg",
"name": "IT"
}
}
}
如何更改 json2 的代码?
解决方案
尝试这个..
1. 创建模型
1.1。语言.java
import com.google.gson.annotations.SerializedName;
public class Language {
@SerializedName("name")
String name;
@SerializedName("flagPath")
String flagPath;
}
1.2. JsonModel.java
import com.google.gson.annotations.SerializedName;
import java.util.ArrayList;
public class JsonModel {
@SerializedName("languages")
ArrayList<Language> languages;
}
2.在assets文件夹中添加你的json文件
3.将json绑定到MainActivity.java
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
try {
JsonModel model = new Gson().fromJson(loadJSONFromAssets(), JsonModel.class);
gridView = (GridView) findViewById(R.id.grid_view)
CustomAdapter customAdapter = new CustomAdapter(this, model.languages);
gridView.setAdapter(customAdapter);
} catch (Exception e) {
e.printStackTrace();
}
}
public String loadJSONFromAssets() {
String json = null;
try {
InputStream inputStream = getAssets().open("languages.json");
int size = inputStream.available();
byte[] buffer = new byte[size];
inputStream.read(buffer);
inputStream.close();
json = new String(buffer, "UTF-8");
} catch (IOException e) {
e.printStackTrace();
}
return json;
}
}
如果问题仍然存在,则可能是您的 gridview 适配器存在问题。
更新的答案
@Smivik 在此处查看更新的代码更改https://gist.github.com/SilambarasanPoonguti/4344ff758cf8ffd0be0fd80ba1837bcf