我在android studio中的一段代码遇到了麻烦,这段代码已经可靠地工作了好几周。 任何时候我尝试通过localhost接收Json(在模拟器或我的设备上调试并通过wifi连接)我收到错误消息:
com.google.gson.JsonParseException:无法解析json
但是,如果我连接到远程服务器以获取JSON Echo,例如:
http://echo.jsontest.com/insert-key-here/insert-value-here/key/value
没有问题。
我已经确认JSON是有效的,就像我说它以前为我工作但我已经在网上双重检查了,我甚至创建了一个新的裸骨应用程序,只需一个按钮和一个请求,但仍然有同样的问题。
代码如下:
public static class PlaceholderFragment extends Fragment {
public static final String ACCOUNT_VIEW_URL = "http://192.168.0.10/~user/tests/accountEcho.php"; //"http://echo.jsontest.com/insert-key-here/insert-value-here/key/value";
Button button;
private static final String ARG_SECTION_NUMBER = "section_number";
public static PlaceholderFragment newInstance(int sectionNumber) {
PlaceholderFragment fragment = new PlaceholderFragment();
Bundle args = new Bundle();
args.putInt(ARG_SECTION_NUMBER, sectionNumber);
fragment.setArguments(args);
return fragment;
}
public PlaceholderFragment() {
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_home_screen, container, false);
button = (Button) rootView.findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
netWork();
}
});
return rootView;
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
((HomeScreenActivity) activity).onSectionAttached(
getArguments().getInt(ARG_SECTION_NUMBER));
}
void netWork() {
Ion.with(getActivity())
.load(ACCOUNT_VIEW_URL)
.asJsonObject()
.setCallback(new FutureCallback<JsonObject>() {
@Override
public void onCompleted(Exception e, JsonObject result) {
if (null == e) {
// Log.v("onCompleted", "not null");
Log.v("result", ""+result+"");
} else {
// Log.v("onCompleted", "null");
Log.v("on completed", "" + e + "");
}
//TODO:::: JSON STRUCTURE - LOAD DP INTO VIEW
}
});
}
}
}
并且JSON响应是:
{
"accType": "2",
"firstname": "duracell",
"lastname": "battery"
"house_num": "122",
"addL1": "Brick Lane",
"addL2": "",
"city": "Middx"
}
此外,如果我从我的计算机上的任何其他应用程序(visualJSON,chromeAdvancedRestClient,safari,firefox等)访问相同的localhost地址,它工作正常,响应是预期的。
任何人都可以告诉我发生什么事吗?
由于
答案 0 :(得分:0)
如果您的JSON位于服务器上并且您通过HTTP请求访问它,则需要仅解析内容,而不是解析带有标题的整个文件。
尝试使用HTTP客户端,使用getResponse.getEntity
或getResponse.getContent
,然后使用其中一个解析器。
我从here复制。
答案 1 :(得分:0)
这就是我解决这个问题的方法:
第1步:
确保您拥有object
课程,objects
必须与JSON
个对象具有相同的名称。
public class Tester {
private String accType;
private String firstname;
private String lastname;
private String addL1;
private String addL2;
private String city;
public String getAccType() {
return accType;
}
public void setAccType(String accType) {
this.accType = accType;
}
public String getFirstname() {
return firstname;
}
public void setFirstname(String firstname) {
this.firstname = firstname;
}
public String getLastname() {
return lastname;
}
public void setLastname(String lastname) {
this.lastname = lastname;
}
public String getAddL1() {
return addL1;
}
public void setAddL1(String addL1) {
this.addL1 = addL1;
}
public String getAddL2() {
return addL2;
}
public void setAddL2(String addL2) {
this.addL2 = addL2;
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
}
第2步:
然后我将JSON数据作为列表检索,但如果假设我有一个项目,我只需将每个元素编入索引,如下所示
Ion.with(getBaseContext())
.load(url_)
.progressDialog(pd)
.as(new TypeToken<List<Tester>>() {
})
.setCallback(new FutureCallback<List<Tester>>() {
@Override
public void onCompleted(Exception e, List<Tester> itemList) {
try {
String firstname= itemList.get(0).getFirstname();
//DO the same to other elements
Log.v("result", "Firstname :"+firstname+"");
pd.dismiss();
}
catch (Exception ex){
Toast.makeText(getApplicationContext(),"Please check your Internet connection",Toast.LENGTH_LONG).show();
}
}
});
}