如何将 JSONArray 转换为 arraylist
How to convert JSONArray to arraylist
我有 JSONArray(不是 JSONObject),这个数组的内容看起来像:
[{"ID":"24","CardName":"Gool","CardCode":"9785898080617","CardCodeType":"EAN-13","CardHolderName":"\u041f\u0443\u043f\u043a\u0438\u043d","CardCountryCode":"UA","CardHolderID":"3","CardSumRait":"55","VotesCount":"11","Rating":"5"},{"ID":"25","CardName":"XCode","CardCode":"9785898080617","CardCodeType":"EAN-13","CardHolderName":"\u041f\u0443\u043f\u043a\u0438\u043d","CardCountryCode":"UA","CardHolderID":"3","CardSumRait":"31","VotesCount":"8","Rating":"3.875"}]
现在我需要将其转换为 ArrayList,我一直在寻找不同的手册,但尝试了一些代码:
我的JSONParcer:
public class JSONParcer {
ArrayList<Person> getArrayOfWebData = new ArrayList<Person>();
static InputStream is = null;
static JSONObject jsonObject = null;
static String json = "";
//конструктор
public JSONParcer() {
}
class Person {
public String cardID;
public String cardName;
public String cardCode;
public String cardCodeType;
public String cardHolderName;
public String cardCountryCode;
public String cardHolderID;
public String cardSumRait;
public String votesCount;
public String rating;
}
public JSONObject getJSONFromUrl(String url) {
//делаем HTTP запрос
try {
//default HTTP client
DefaultHttpClient httpClient = new DefaultHttpClient();
HttpPost httpPost = new HttpPost(url);
HttpResponse httpResponse = httpClient.execute(httpPost);
HttpEntity httpEntity = httpResponse.getEntity();
is = httpEntity.getContent();
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
try {
BufferedReader reader = new BufferedReader(new InputStreamReader(is, "iso-8859-1"), 8);
StringBuilder sb = new StringBuilder();
String line = null;
while ((line = reader.readLine()) != null){
sb.append(line + "\n");
}
is.close();
json = sb.toString();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
catch (IOException e) {
Log.e("Buffer Error", "Error converting result " + e.toString());
}
try {
jsonObject = new JSONObject(json);
} catch (JSONException e) {
Log.e("JSON parcer" , "Error parcing data " +e.toString());
}
try{
JSONArray jsonArray = new JSONArray(json);
for (int i=0; i < jsonArray.length(); i++) {
JSONObject json_data = jsonArray.getJSONObject(i);
Person resultRow = new Person();
resultRow.cardID = json_data.getString("ID");
resultRow.cardName = json_data.getString("CardName");
resultRow.cardCode = json_data.getString("CardCode");
resultRow.cardCodeType = json_data.getString("CardCodeType");
resultRow.cardHolderName = json_data.getString("CardHolderName");
resultRow.cardCountryCode =json_data.getString("CardCountryCode");
resultRow.cardHolderID = json_data.getString("CardHolderID");
resultRow.cardSumRait = json_data.getString("CardSumRait");
resultRow.votesCount = json_data.getString("VotesCount");
resultRow.rating = json_data.getString("Rating");
getArrayOfWebData.add(resultRow);
}
} catch (JSONException e) {
e.printStackTrace();
}
return jsonObject;
}
我的 MainActivity:
public class MainActivity extends ActionBarActivity {
String jsonString;
Button btn;
ArrayList<Person> getArrayOfWebData = new ArrayList<Person>();
public void showArrayinLogs(View view) {
new JsonParce().execute();
}
class Person {
public String cardID;
public String cardName;
public String cardCode;
public String cardCodeType;
public String cardHolderName;
public String cardCountryCode;
public String cardHolderID;
public String cardSumRait;
public String votesCount;
public String rating;
}
String url1 = "/*my url here*/";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
public class JsonParce extends AsyncTask<String , String, JSONObject>{
@Override
protected JSONObject doInBackground(String... args) {
JSONParcer jsonParcer = new JSONParcer();
JSONObject json = jsonParcer.getJSONFromUrl(url1);
return json;
}
@Override
protected void onPostExecute(JSONObject jsonObject ) {
int a = getArrayOfWebData.size();
for(int i =0 ; i<a ; i++){
Log.i("WORKS", getArrayOfWebData.get(i).toString());
}
}
}
}
当我启动我的程序并单击按钮以在日志中显示数组时,我有这个
Value [{"Rating":"5","CardName":"Gool","VotesCount":"11","CardSumRait":"55","CardHolderName":"Пупкин","ID":"24","CardCountryCode":"UA","CardHolderID":"3","CardCode":"9785898080617","CardCodeType":"EAN-13"},{"Rating":"3.875","CardName":"XCode","VotesCount":"8","CardSumRait":"31","CardHolderName":"Пупкин","ID":"25","CardCountryCode":"UA","CardHolderID":"3","CardCode":"9785898080617","CardCodeType":"EAN-13"}] of type org.json.JSONArray cannot be converted to JSONObject
我知道我在我的 JSONParcer class 中犯了错误,但是你能解释一下我需要改变什么吗?只是将 JSONObject 重命名为 JSONArray 并不能正常工作。感谢回答
因为 json 中提供的字符串 post 是 JSONArray of JSONObject
而不是 JSONObject。所以需要从 api.
的响应中获取 JSONArray
在 getJSONFromUrl
方法中进行以下更改:
1. 将 getJSONFromUrl
方法 return 类型从 JSONObject
更改为 JSONArray
2. 将响应字符串转换为 JSONArray
而不是 JSONObject
:
jsonArray = new JSONArray(json);
3. Return jsonArray
来自 getJSONFromUrl
4. 在 MainActivity
class 从 getJSONFromUrl
方法得到 JSONArray
:
JSONArray json = jsonParcer.getJSONFromUrl(url1);
5. 同时将 doInBackground
方法 return 类型更改为 JSONArray
你可以像你正在使用的那样解析它,或者你可以使用 Gson as described in this answer or you can use Jackson as described here.
以更少的代码和更高的性能来做同样的事情
问题出在你的JSONParcer
class。在下面的代码中,您试图从 JSON 数组 (json
) 创建一个 JSON 对象,这就是您收到错误 type org.json.JSONArray cannot be converted to JSONObject
.
的原因
try {
jsonObject = new JSONObject(json);
} catch (JSONException e) {
Log.e("JSON parcer" , "Error parcing data " +e.toString());
}
解决此问题的方法是删除那部分代码,因为您正在阅读 json
两次。
你在这里已经做对了 --> JSONArray jsonArray = new JSONArray(json);
.
public class JSONParcer {
ArrayList<Person> getArrayOfWebData = new ArrayList<Person>();
static InputStream is = null;
static JSONArray jsonArray = null;
static String json = "";
....
// change getJSONFromUrl to return ArrayList<Person>
public ArrayList<Person> getJSONFromUrl(String url) {
//делаем HTTP запрос
....
try {
BufferedReader reader = new BufferedReader(new InputStreamReader(is, "iso-8859-1"), 8);
StringBuilder sb = new StringBuilder();
String line = null;
while ((line = reader.readLine()) != null){
sb.append(line + "\n");
}
is.close();
json = sb.toString();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
catch (IOException e) {
Log.e("Buffer Error", "Error converting result " + e.toString());
}
try{
jsonArray = new JSONArray(json);
for (int i=0; i < jsonArray.length(); i++) {
JSONObject json_data = jsonArray.getJSONObject(i);
Person resultRow = new Person();
resultRow.cardID = json_data.getString("ID");
resultRow.cardName = json_data.getString("CardName");
resultRow.cardCode = json_data.getString("CardCode");
resultRow.cardCodeType = json_data.getString("CardCodeType");
resultRow.cardHolderName = json_data.getString("CardHolderName");
resultRow.cardCountryCode =json_data.getString("CardCountryCode");
resultRow.cardHolderID = json_data.getString("CardHolderID");
resultRow.cardSumRait = json_data.getString("CardSumRait");
resultRow.votesCount = json_data.getString("VotesCount");
resultRow.rating = json_data.getString("Rating");
getArrayOfWebData.add(resultRow);
}
} catch (JSONException e) {
e.printStackTrace();
}
// return ArrayList<Person>
return getArrayOfWebData;
}
然后在你的MainActivity
中,将doInBackground
返回的对象,对象输入类型改为AsyncTask
,对象输入类型onPostExecute
改为JSONArray
:
public class MainActivity extends ActionBarActivity {
...
public class JsonParce extends AsyncTask<String, String, ArrayList<Person>>{
@Override
protected ArrayList<Person> doInBackground(String... args) {
JSONParcer jsonParcer = new JSONParcer();
ArrayList<Person> personArrayList = jsonParcer.getJSONFromUrl(url1);
return personArrayList;
}
@Override
protected void onPostExecute(ArrayList<Person> personArrayList) {
int a = personArrayList.size();
for(int i =0 ; i<a ; i++){
Log.i("WORKS", personArrayList.get(i).toString());
}
}
}
}
编辑
我根据您的评论更新了我的回答。您的 JsonParce
AsyncTask
现在 returns ArrayList
个 Person
。让我知道这是否有帮助。
我有 JSONArray(不是 JSONObject),这个数组的内容看起来像:
[{"ID":"24","CardName":"Gool","CardCode":"9785898080617","CardCodeType":"EAN-13","CardHolderName":"\u041f\u0443\u043f\u043a\u0438\u043d","CardCountryCode":"UA","CardHolderID":"3","CardSumRait":"55","VotesCount":"11","Rating":"5"},{"ID":"25","CardName":"XCode","CardCode":"9785898080617","CardCodeType":"EAN-13","CardHolderName":"\u041f\u0443\u043f\u043a\u0438\u043d","CardCountryCode":"UA","CardHolderID":"3","CardSumRait":"31","VotesCount":"8","Rating":"3.875"}]
现在我需要将其转换为 ArrayList,我一直在寻找不同的手册,但尝试了一些代码:
我的JSONParcer:
public class JSONParcer {
ArrayList<Person> getArrayOfWebData = new ArrayList<Person>();
static InputStream is = null;
static JSONObject jsonObject = null;
static String json = "";
//конструктор
public JSONParcer() {
}
class Person {
public String cardID;
public String cardName;
public String cardCode;
public String cardCodeType;
public String cardHolderName;
public String cardCountryCode;
public String cardHolderID;
public String cardSumRait;
public String votesCount;
public String rating;
}
public JSONObject getJSONFromUrl(String url) {
//делаем HTTP запрос
try {
//default HTTP client
DefaultHttpClient httpClient = new DefaultHttpClient();
HttpPost httpPost = new HttpPost(url);
HttpResponse httpResponse = httpClient.execute(httpPost);
HttpEntity httpEntity = httpResponse.getEntity();
is = httpEntity.getContent();
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
try {
BufferedReader reader = new BufferedReader(new InputStreamReader(is, "iso-8859-1"), 8);
StringBuilder sb = new StringBuilder();
String line = null;
while ((line = reader.readLine()) != null){
sb.append(line + "\n");
}
is.close();
json = sb.toString();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
catch (IOException e) {
Log.e("Buffer Error", "Error converting result " + e.toString());
}
try {
jsonObject = new JSONObject(json);
} catch (JSONException e) {
Log.e("JSON parcer" , "Error parcing data " +e.toString());
}
try{
JSONArray jsonArray = new JSONArray(json);
for (int i=0; i < jsonArray.length(); i++) {
JSONObject json_data = jsonArray.getJSONObject(i);
Person resultRow = new Person();
resultRow.cardID = json_data.getString("ID");
resultRow.cardName = json_data.getString("CardName");
resultRow.cardCode = json_data.getString("CardCode");
resultRow.cardCodeType = json_data.getString("CardCodeType");
resultRow.cardHolderName = json_data.getString("CardHolderName");
resultRow.cardCountryCode =json_data.getString("CardCountryCode");
resultRow.cardHolderID = json_data.getString("CardHolderID");
resultRow.cardSumRait = json_data.getString("CardSumRait");
resultRow.votesCount = json_data.getString("VotesCount");
resultRow.rating = json_data.getString("Rating");
getArrayOfWebData.add(resultRow);
}
} catch (JSONException e) {
e.printStackTrace();
}
return jsonObject;
}
我的 MainActivity:
public class MainActivity extends ActionBarActivity {
String jsonString;
Button btn;
ArrayList<Person> getArrayOfWebData = new ArrayList<Person>();
public void showArrayinLogs(View view) {
new JsonParce().execute();
}
class Person {
public String cardID;
public String cardName;
public String cardCode;
public String cardCodeType;
public String cardHolderName;
public String cardCountryCode;
public String cardHolderID;
public String cardSumRait;
public String votesCount;
public String rating;
}
String url1 = "/*my url here*/";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
public class JsonParce extends AsyncTask<String , String, JSONObject>{
@Override
protected JSONObject doInBackground(String... args) {
JSONParcer jsonParcer = new JSONParcer();
JSONObject json = jsonParcer.getJSONFromUrl(url1);
return json;
}
@Override
protected void onPostExecute(JSONObject jsonObject ) {
int a = getArrayOfWebData.size();
for(int i =0 ; i<a ; i++){
Log.i("WORKS", getArrayOfWebData.get(i).toString());
}
}
}
}
当我启动我的程序并单击按钮以在日志中显示数组时,我有这个
Value [{"Rating":"5","CardName":"Gool","VotesCount":"11","CardSumRait":"55","CardHolderName":"Пупкин","ID":"24","CardCountryCode":"UA","CardHolderID":"3","CardCode":"9785898080617","CardCodeType":"EAN-13"},{"Rating":"3.875","CardName":"XCode","VotesCount":"8","CardSumRait":"31","CardHolderName":"Пупкин","ID":"25","CardCountryCode":"UA","CardHolderID":"3","CardCode":"9785898080617","CardCodeType":"EAN-13"}] of type org.json.JSONArray cannot be converted to JSONObject
我知道我在我的 JSONParcer class 中犯了错误,但是你能解释一下我需要改变什么吗?只是将 JSONObject 重命名为 JSONArray 并不能正常工作。感谢回答
因为 json 中提供的字符串 post 是 JSONArray of JSONObject
而不是 JSONObject。所以需要从 api.
在 getJSONFromUrl
方法中进行以下更改:
1. 将 getJSONFromUrl
方法 return 类型从 JSONObject
JSONArray
2. 将响应字符串转换为 JSONArray
而不是 JSONObject
:
jsonArray = new JSONArray(json);
3. Return jsonArray
来自 getJSONFromUrl
4. 在 MainActivity
class 从 getJSONFromUrl
方法得到 JSONArray
:
JSONArray json = jsonParcer.getJSONFromUrl(url1);
5. 同时将 doInBackground
方法 return 类型更改为 JSONArray
你可以像你正在使用的那样解析它,或者你可以使用 Gson as described in this answer or you can use Jackson as described here.
以更少的代码和更高的性能来做同样的事情问题出在你的JSONParcer
class。在下面的代码中,您试图从 JSON 数组 (json
) 创建一个 JSON 对象,这就是您收到错误 type org.json.JSONArray cannot be converted to JSONObject
.
try {
jsonObject = new JSONObject(json);
} catch (JSONException e) {
Log.e("JSON parcer" , "Error parcing data " +e.toString());
}
解决此问题的方法是删除那部分代码,因为您正在阅读 json
两次。
你在这里已经做对了 --> JSONArray jsonArray = new JSONArray(json);
.
public class JSONParcer {
ArrayList<Person> getArrayOfWebData = new ArrayList<Person>();
static InputStream is = null;
static JSONArray jsonArray = null;
static String json = "";
....
// change getJSONFromUrl to return ArrayList<Person>
public ArrayList<Person> getJSONFromUrl(String url) {
//делаем HTTP запрос
....
try {
BufferedReader reader = new BufferedReader(new InputStreamReader(is, "iso-8859-1"), 8);
StringBuilder sb = new StringBuilder();
String line = null;
while ((line = reader.readLine()) != null){
sb.append(line + "\n");
}
is.close();
json = sb.toString();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
catch (IOException e) {
Log.e("Buffer Error", "Error converting result " + e.toString());
}
try{
jsonArray = new JSONArray(json);
for (int i=0; i < jsonArray.length(); i++) {
JSONObject json_data = jsonArray.getJSONObject(i);
Person resultRow = new Person();
resultRow.cardID = json_data.getString("ID");
resultRow.cardName = json_data.getString("CardName");
resultRow.cardCode = json_data.getString("CardCode");
resultRow.cardCodeType = json_data.getString("CardCodeType");
resultRow.cardHolderName = json_data.getString("CardHolderName");
resultRow.cardCountryCode =json_data.getString("CardCountryCode");
resultRow.cardHolderID = json_data.getString("CardHolderID");
resultRow.cardSumRait = json_data.getString("CardSumRait");
resultRow.votesCount = json_data.getString("VotesCount");
resultRow.rating = json_data.getString("Rating");
getArrayOfWebData.add(resultRow);
}
} catch (JSONException e) {
e.printStackTrace();
}
// return ArrayList<Person>
return getArrayOfWebData;
}
然后在你的MainActivity
中,将doInBackground
返回的对象,对象输入类型改为AsyncTask
,对象输入类型onPostExecute
改为JSONArray
:
public class MainActivity extends ActionBarActivity {
...
public class JsonParce extends AsyncTask<String, String, ArrayList<Person>>{
@Override
protected ArrayList<Person> doInBackground(String... args) {
JSONParcer jsonParcer = new JSONParcer();
ArrayList<Person> personArrayList = jsonParcer.getJSONFromUrl(url1);
return personArrayList;
}
@Override
protected void onPostExecute(ArrayList<Person> personArrayList) {
int a = personArrayList.size();
for(int i =0 ; i<a ; i++){
Log.i("WORKS", personArrayList.get(i).toString());
}
}
}
}
编辑
我根据您的评论更新了我的回答。您的 JsonParce
AsyncTask
现在 returns ArrayList
个 Person
。让我知道这是否有帮助。