Android POJO 类中的 JSON 解析

Posted

技术标签:

【中文标题】Android POJO 类中的 JSON 解析【英文标题】:JSON Parsing in Android POJO class 【发布时间】:2020-11-13 03:03:10 【问题描述】:

对于下面的响应,但我得到了错误。

JSON 响应。

[
    
        "accountId": "51d44c1e44aec7ccda63f960",
        "id": "4e74fdf0-f428-11e9-b107-42010a9a0007",
        "name": "test edit asset group1 ",
        "description": "New Asset-group is updatring",
        "assets": [
            "4a51bcc0-263e-11ea-83e0-42010a9a0007"
        ],
        "beacon": null,
        "assetNames": null
    ,
    
        "accountId": "51d44c1e44aec7ccda63f960",
        "id": "518d8890-f428-11e9-b107-42010a9a0007",
        "name": "test edit asset group2 ",
        "description": "New Asset-group is updatring",
        "assets": null,
        "beacon": null,
        "assetNames": null
    ,
    
        "accountId": "51d44c1e44aec7ccda63f960",
        "id": "8b1176b0-3b88-11ea-b11f-42010a9a0007",
        "name": "test",
        "description": "test",
        "assets": [
            "e4a7d360-5c7e-11ea-b6b9-42010a9a0007"
        ],
        "beacon": null,
        "assetNames": null
    ,
    
        "accountId": "51d44c1e44aec7ccda63f960",
        "id": "9af47750-f62b-11e9-b6ae-42010a9a0007",
        "name": "test create asset for create asset group ",
        "description": null,
        "assets": null,
        "beacon": null,
        "assetNames": null
    ,
    
        "accountId": "51d44c1e44aec7ccda63f960",
        "id": "abc",
        "name": null,
        "description": null,
        "assets": [
            "d34e6d90-92c0-11ea-825d-42010a9a0007",
            "d6a62410-92c0-11ea-825d-42010a9a0007",
            "da153320-92c0-11ea-825d-42010a9a0007"
        ],
        "beacon": null,
        "assetNames": null
    ,
    
        "accountId": "51d44c1e44aec7ccda63f960",
        "id": "ba5d3030-f493-11e9-b107-42010a9a0007",
        "name": "test edit asset group1 ",
        "description": "New Asset-group is updatring",
        "assets": null,
        "beacon": null,
        "assetNames": null
    ,
    
        "accountId": "51d44c1e44aec7ccda63f960",
        "id": "bd7a9cd0-f493-11e9-b107-42010a9a0007",
        "name": "test edit asset group2 ",
        "description": "New Asset-group is updatring",
        "assets": null,
        "beacon": null,
        "assetNames": null
    ,
    
        "accountId": "51d44c1e44aec7ccda63f960",
        "id": "cc62c610-f62c-11e9-b6ae-42010a9a0007",
        "name": "test edit asset group1 ",
        "description": "New Asset-group is updatring",
        "assets": null,
        "beacon": null,
        "assetNames": null
    ,
    
        "accountId": "51d44c1e44aec7ccda63f960",
        "id": "cf3ce820-f62c-11e9-b6ae-42010a9a0007",
        "name": "test edit asset group2 ",
        "description": "New Asset-group is updatring",
        "assets": null,
        "beacon": null,
        "assetNames": null
    ,
    
        "accountId": "51d44c1e44aec7ccda63f960",
        "id": "d9783b00-f62c-11e9-b6ae-42010a9a0007",
        "name": "test edit asset group1 ",
        "description": "New Asset-group is updatring",
        "assets": null,
        "beacon": null,
        "assetNames": null
    ,
    
        "accountId": "51d44c1e44aec7ccda63f960",
        "id": "dc8cce00-f62c-11e9-b6ae-42010a9a0007",
        "name": "test edit asset group2 ",
        "description": "New Asset-group is updatring",
        "assets": null,
        "beacon": null,
        "assetNames": null
    ,
    
        "accountId": "51d44c1e44aec7ccda63f960",
        "id": "dd6102c0-92c0-11ea-825d-42010a9a0007",
        "name": "test edit asset group1 ",
        "description": "New Asset-group is updatring",
        "assets": [
            "d34e6d90-92c0-11ea-825d-42010a9a0007",
            "d6a62410-92c0-11ea-825d-42010a9a0007"
        ],
        "beacon": null,
        "assetNames": null
    ,
    
        "accountId": "51d44c1e44aec7ccda63f960",
        "id": "e0b11820-92c0-11ea-825d-42010a9a0007",
        "name": "test edit asset group2 ",
        "description": "New Asset-group is updatring",
        "assets": [
            "d6a62410-92c0-11ea-825d-42010a9a0007",
            "da153320-92c0-11ea-825d-42010a9a0007"
        ],
        "beacon": null,
        "assetNames": null
    ,
    
        "accountId": "51d44c1e44aec7ccda63f960",
        "id": "ea35c870-c27b-11e9-a265-42010a9a0007",
        "name": "gr1",
        "description": "",
        "assets": [
            "3d9cd800-2636-11ea-83e0-42010a9a0007",
            "68d07130-260e-11ea-83e0-42010a9a0007"
        ],
        "beacon": null,
        "assetNames": null
    ,
    
        "accountId": "51d44c1e44aec7ccda63f960",
        "id": "ef799780-c27b-11e9-a265-42010a9a0007",
        "name": "gr2",
        "description": "",
        "assets": null,
        "beacon": null,
        "assetNames": null
    
]

我的 Pojo 类创建如下。 API 接口。

Call<VoAssetGroup> getBeaconAssetGroup1(@Path("id") String id, @Header("ManagedAccountId") String ManagedAccountId);

Pojo 类创建 VoAssetGroup

package com.succorfish.installer.Vo;

import java.io.Serializable;
import java.util.List;

public class VoAssetGroup implements Serializable 

    String accountId="";
    String id="";
    String name="";
    String description="";


    List<VoAssetGroupassets> assets;
    VoAssetGroupbeacon beacon;
    VoAssetGroupassetsassetNames assetNames;


    public String getAccountId() 
        return accountId;
    

    public void setAccountId(String accountId) 
        this.accountId = accountId;
    

    public String getId() 
        return id;
    

    public void setId(String id) 
        this.id = id;
    

    public String getName() 
        return name;
    

    public void setName(String name) 
        this.name = name;
    

    public String getDescription() 
        return description;
    

    public void setDescription(String description) 
        this.description = description;
    

    public List<VoAssetGroupassets> getAssets() 
        return assets;
    

    public void setAssets(List<VoAssetGroupassets> assets) 
        this.assets = assets;
    

    public VoAssetGroupbeacon getBeacon() 
        return beacon;
    

    public void setBeacon(VoAssetGroupbeacon beacon) 
        this.beacon = beacon;
    

    public VoAssetGroupassetsassetNames getAssetNames() 
        return assetNames;
    

    public void setAssetNames(VoAssetGroupassetsassetNames assetNames) 
        this.assetNames = assetNames;
    


VoAssetGroupassets 类

package com.succorfish.installer.Vo;

import java.io.Serializable;
import java.util.List;

public class VoAssetGroupassets implements Serializable 
   String assetsArray="";

    public String getAssetsArray() 
        return assetsArray;
    

    public void setAssetsArray(String assetsArray) 
        this.assetsArray = assetsArray;
    

VoAssetGroupbeacon 类

package com.succorfish.installer.Vo;

import java.io.Serializable;

public class VoAssetGroupbeacon implements Serializable 
    String beacon="";

    public String getBeacon() 
        return beacon;
    

    public void setBeacon(String beacon) 
        this.beacon = beacon;
    

VoAssetGroupassetsassetNames 类

package com.succorfish.installer.Vo;

public class VoAssetGroupassetsassetNames 
    String assetNames="";

    public String getAssetNames() 
        return assetNames;
    

    public void setAssetNames(String assetNames) 
        this.assetNames = assetNames;
    

有人可以指导我在 android 的改造中创建 Pojo 类。 如果我使用通用类型作为字符串,我将获得成功的响应。 但是当我使用自定义类作为通用类型时。响应失败。

【问题讨论】:

你能发布你创建的改造实例吗 请发布您的改造代码 sn-p 也用于进行 API 调用。 我已经发布了整个代码sn-p。请让我知道还有什么需要的。我会发布它。反正解决方法我已经贴出来了。解决后在下面。 【参考方案1】:

我认为错误是因为在响应中assets 是一个字符串列表,而您已将其视为具有属性assetArray 的对象。

尝试将List&lt;VoAssetGroupassets&gt; assets; 更改为List&lt;String&gt; assets;

如果VoAssetGroupbeaconVoAssetGroupassetsassetNames 要成为字符串,我认为需要对它们进行类似的更改。

【讨论】:

感谢您的解决方案。修改 List 资产后;列表 信标;列出 资产名称;以及 API 接口 Call> getBeaconAssetGroup1(@Path("id") String id, @Header("ManagedAccountId") String ManagedAccountId) 的一些小修改;解决方案奏效了。【参考方案2】:

您得到的响应是VoAssetGroup 的数组列表

所以你的调用需要修改为

Call&lt;List&lt;VoAssetGroup&gt;&gt; getBeaconAssetGroup1(@Path("id") String id, @Header("ManagedAccountId") String ManagedAccountId);

【讨论】:

感谢您的解决方案。修改 List 资产后;列表 信标;列出 资产名称;以及 API 接口 Call> getBeaconAssetGroup1(@Path("id") String id, @Header("ManagedAccountId") String ManagedAccountId) 的一些小修改;解决方案奏效了。【参考方案3】:

解决办法是

API接口修改。

  Call<List<VoAssetGroup>> getBeaconAssetGroup1(@Path("id") String id, @Header("ManagedAccountId") String ManagedAccountId);

在 VoAssetGroup 类中我做了这个修改。

import java.io.Serializable;
import java.util.List;

public class VoAssetGroup implements Serializable 

    String accountId="";
    String id="";
    String name="";
    String description="";


    List<String> assets;
    List<String> beacon;
    List<String> assetNames;


    public String getAccountId() 
        return accountId;
    

    public void setAccountId(String accountId) 
        this.accountId = accountId;
    

    public String getId() 
        return id;
    

    public void setId(String id) 
        this.id = id;
    

    public String getName() 
        return name;
    

    public void setName(String name) 
        this.name = name;
    

    public String getDescription() 
        return description;
    

    public void setDescription(String description) 
        this.description = description;
    

    public List<String> getAssets() 
        return assets;
    

    public void setAssets(List<String> assets) 
        this.assets = assets;
    

    public List<String> getBeacon() 
        return beacon;
    

    public void setBeacon(List<String> beacon) 
        this.beacon = beacon;
    

    public List<String> getAssetNames() 
        return assetNames;
    

    public void setAssetNames(List<String> assetNames) 
        this.assetNames = assetNames;
    

【讨论】:

以上是关于Android POJO 类中的 JSON 解析的主要内容,如果未能解决你的问题,请参考以下文章

Java POJO的JSON对象数组

如何在 android 中解析来自我的中间件的 Directions API 响应?

使用改造将不一致的 JSON 解析为 POJO

Kotlin Android,从 HTTP 请求解析 Json

使用改造将 json 解析为 POJO

Android:将 json 值映射到 pojo