Java 从后端解析JSON时出现问题
由于我一直在从事一个需要从后端接收Java 从后端解析JSON时出现问题,java,android,retrofit,Java,Android,Retrofit,由于我一直在从事一个需要从后端接收JSON的Android项目,我使用springboot2.1.7在Java中编写了JSON 从后端来看,它是正常的,可以工作。但是从Android的角度来看,我无法解析变量。 当我尝试使用构造分析变量时: JSONArray JSONArray=新的JSONArray(变量); 然后我收到了JSONArray中的JSONArray()无法应用于com.package.Model的信息。我也尝试了不同的方法来解决这个问题: 后端 @RequestMapping
JSON
的Android项目,我使用springboot2.1.7在Java中编写了JSON
从后端来看,它是正常的,可以工作。但是从Android的角度来看,我无法解析变量。
当我尝试使用构造分析变量时:
JSONArray JSONArray=新的JSONArray(变量);
然后我收到了JSONArray中的JSONArray()无法应用于com.package.Model
的信息。我也尝试了不同的方法来解决这个问题:
后端
@RequestMapping(value=“/approachh”,method=RequestMethod.GET)
@应答器
公共列表getList(){
List categoriesList=新建ArrayList();
categoriesList=categoriesRepository.findAll();
返回分类列表;
}
JSON响应
{
“名单”:[
{
“id”:1,
“类别名称”:“类别1”,
“子类别”:[
{
“id”:1,
“子类别名称”:“lkjasdf”
}
]
},
{
“id”:2,
“类别名称”:“类别2”,
“子类别”:[
{
“id”:2,
“子类别名称”:“LKJASDASDFAF”
}
]
}
]
}
客户端(Android)
JSONArray JSONArray=新JSONArray(变量);
//然后我收到了这样的信息:JSONArray中的JSONArray()不能应用于com.package.Model。我也尝试了不同的方法来解决这个问题:
字符串json=“”;
Gson Gson=new GsonBuilder().create();
类型showType=newTypeToken(){}.getType();
ArrayList approach=gson.fromJson(json,showType);
String catName=String.valueOf(接近.get(0.getCategoryName());
//但当我尝试接收有关catName的信息时,出现了0。
Log.d(“猫名”、“猫名”+猫名);
接近类
}
MainActivity.class Android
方法,在该方法中,我连接到localhost以检索信息
private void fetchhhdata(){
compositeDisposable.add(iMyAPI.getAll()
.subscribeOn(Schedulers.io())
.subscribeOn(AndroidSchedulers.mainThread())
.订阅(新消费者){
@RequiresApi(api=Build.VERSION\u CODES.KITKAT)
@凌驾
public void accept(方法)引发异常{
showData(Collections.singletonList(方法));
}
}));
}
MainActivity.class Android
showData()
private void showData(列表方法){
JSONArray JSONArray=新的JSONArray(方法);
对于(int i=1;i,这里有一个工作示例。如果您再引入一个classCategoriesResponse
(见下文),则会简单得多
然后确保传递给gson.fromJson(json,CategoriesResponse.class);
的json
参数是从端点检索到的实际json字符串或Reader
或JsonObject
@Test
public void test() {
String json = "{\n" + " \"List\":[\n" + " {\n" + " \"id\":1,\n" + " \"categoryName"
+ "\":\"Categories1\",\n"
+ " \"subCategories\":[\n" + " {\n" + " \"id\":1,\n"
+ " \"subCategoriesName\":\"lkjasdf\"\n" + " }\n" + " ]\n" + " },\n" + " {\n"
+ " \"id\":2,\n" + " \"categoryName\":\"Categories2\",\n" + " \"subCategories\":[\n"
+ " {\n" + " \"id\":2,\n" + " \"subCategoriesName\":\"lkjasdasdfasf\"\n"
+ " }\n" + " ]\n" + " }\n" + " ]\n" + "}";
Gson gson = new Gson();
CategoriesResponse gsonResponse = gson.fromJson(json, CategoriesResponse.class);
assertEquals(2, gsonResponse.categories.size());
}
public class Approach {
@SerializedName("categoryName") @Expose private String categoryName;
@SerializedName("subCategories") @Expose private List<SubCategories> subCategories;
public Approach(String categoryName, List<SubCategories> subCategories) {
this.categoryName = categoryName;
this.subCategories = subCategories;
}
}
public class SubCategories {
@SerializedName("id") @Expose private int id;
@SerializedName("subCategoriesName") @Expose private String subCategoriesName;
}
public class CategoriesResponse {
@SerializedName("List") @Expose private List<Approach> categories;
}
@试验
公开无效测试(){
字符串json=“{\n”+“\”列表\:[\n”+“{\n”+“\”id\”:1、\n“+”\“categoryName”
+“\”:\“类别1\”,\n”
+“\“子类别\:[\n”+“{\n”+“\“id\”:1,\n”
+“\”子类别名称\\:\”lkjasdf\“\n”+“}\n”+“]\n”+“}\n”+“{\n”
+“\“id\”:2、\n“+”\“categoryName\:\“Categories2\”、\n“+”\“subCategories\”:[\n”
+{\n“+”\“id\”:2、\n“+”\“子类别名称”:“LKJASDAFSF\”\n
+“}\n”+“]\n”+“}\n”+“]\n”+“}”;
Gson Gson=新的Gson();
CategoriesResponse gsonResponse=gson.fromJson(json,CategoriesResponse.class);
assertEquals(2,gsonResponse.categories.size());
}
公共课教学法{
@SerializedName(“categoryName”)@公开私有字符串categoryName;
@SerializedName(“子类别”)@公开私有列表子类别;
公共方法(字符串类别名称、列表子类别){
this.categoryName=categoryName;
this.subCategories=子类别;
}
}
公共类子类别{
@SerializedName(“id”)@Expose private int id;
@SerializedName(“子类别名称”)@公开私有字符串子类别名称;
}
公共类类别响应{
@SerializedName(“List”)@公开私有列表类别;
}
提供方法类Rajnish suryavanshi感谢您的回答,刚刚添加了方法类和子类以添加一个调试器来检查变量的值,由变量形成的json数组请添加变量
声明和初始化我添加了两个方法:fetchhhdata()和showData()。在fetchhhdata()中,我尝试检索信息,并将变量“approach”发送到showData()。在showData()中,我尝试从中检索信息。但它不起作用。控制台中没有显示任何信息。
public class SubCategories {
@SerializedName("id")
@Expose
private int id;
@SerializedName("subCategoriesName")
@Expose
private String subCategoriesName;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getSubCategoriesName() {
return subCategoriesName;
}
public void setSubCategoriesName(String subCategoriesName) {
this.subCategoriesName = subCategoriesName;
}
private void fetchhhhData() {
compositeDisposable.add(iMyAPI.getAll()
.subscribeOn(Schedulers.io())
.subscribeOn(AndroidSchedulers.mainThread())
.subscribe(new Consumer<Approach>() {
@RequiresApi(api = Build.VERSION_CODES.KITKAT)
@Override
public void accept(Approach approach) throws Exception {
showData(Collections.singletonList(approach));
}
}));
}
private void showData(List<Approach> approaches) {
JSONArray jsonArray = new JSONArray(approaches);
for (int i=1; i<= jsonArray.length() - 1; i++) {
try {
JSONObject jsonObject = jsonArray.getJSONObject(i);
String categ = jsonObject.get("List").toString();
Log.d("categ","categ" + categ);
// String catName = String.valueOf(jsonObject.get("List"));
// String catName = jsonObject.getString("categoryName");
// Log.d("catName","catName" + catName);
} catch (JSONException e) {
e.printStackTrace();
}
}
}
@Test
public void test() {
String json = "{\n" + " \"List\":[\n" + " {\n" + " \"id\":1,\n" + " \"categoryName"
+ "\":\"Categories1\",\n"
+ " \"subCategories\":[\n" + " {\n" + " \"id\":1,\n"
+ " \"subCategoriesName\":\"lkjasdf\"\n" + " }\n" + " ]\n" + " },\n" + " {\n"
+ " \"id\":2,\n" + " \"categoryName\":\"Categories2\",\n" + " \"subCategories\":[\n"
+ " {\n" + " \"id\":2,\n" + " \"subCategoriesName\":\"lkjasdasdfasf\"\n"
+ " }\n" + " ]\n" + " }\n" + " ]\n" + "}";
Gson gson = new Gson();
CategoriesResponse gsonResponse = gson.fromJson(json, CategoriesResponse.class);
assertEquals(2, gsonResponse.categories.size());
}
public class Approach {
@SerializedName("categoryName") @Expose private String categoryName;
@SerializedName("subCategories") @Expose private List<SubCategories> subCategories;
public Approach(String categoryName, List<SubCategories> subCategories) {
this.categoryName = categoryName;
this.subCategories = subCategories;
}
}
public class SubCategories {
@SerializedName("id") @Expose private int id;
@SerializedName("subCategoriesName") @Expose private String subCategoriesName;
}
public class CategoriesResponse {
@SerializedName("List") @Expose private List<Approach> categories;
}