JsonArray作为空字符串解析问题与改造

时间:2018-08-11 10:18:30

标签: android gson retrofit

我有一个json,如果有数据,其中1个键作为jsonArray出现,否则作为空字符串出现。在翻新的gson中解析时出现错误。

  "section": "Technology",
  "subsection": "",
  "title": "Depiction of Amazon Stirs a Debate About Work Culture",
  "abstract": "Details of working conditions at Amazon led to a response from employees, relatives and friends.",
  "url": "http://www.nytimes.com/2015/08/19/technology/amazon-workplace-reactions-comments.html",
  "byline": "By THE NEW YORK TIMES",
  "item_type": "Article",
  "updated_date": "2015-08-18T07:35:33-5:00",
  "created_date": "2015-08-18T07:35:35-5:00",
  "published_date": "2015-08-19T04:00:00-5:00",
  "material_type_facet": "News",
  "kicker": "",
  "des_facet": [
    "Workplace Environment"
  ],
  "org_facet": [
    "Amazon.com Inc"
  ],
  "per_facet": "",
  "geo_facet": "",

des_facet,org_facet,per_facet,geo_facet是jsonArray,但是您可以看到2没有数据,因此以空字符串形式出现。

如何通过改型+ gson处理这种情况。

在服务器上无法更改Json格式。

有什么办法可以在android中实现吗?

3 个答案:

答案 0 :(得分:1)

好,所以有两种方法可以解决这个问题

选项1:

JSON(我作为示例)

"des_facet": [
        "Workplace Environment"
    ],
    "org_facet": [
        "Amazon.com Inc"
    ],
    "per_facet": ["Akshay"],
    "geo_facet": ""

在模型类中,将这些变量转换为Object类型

@Expose
    @SerializedName("geo_facet")
    private Object geo_facet;
    @Expose
    @SerializedName("per_facet")
    private Object per_facet;

然后在您要设置数据的位置执行以下操作

if (model != null)
        {
            if (model.getGeo_facet() != null || model.getGeo_facet() != "")
            {
                Object arr = model.getGeo_facet();
            }
            if (model.getPer_facet() !=null || model.getPer_facet()!= "")
            {
                Object arr = model.getPer_facet();
                if (arr!=null && arr.toString().length()>0)
                {
                    arr = arr.toString();
                    Log.d("akshay","arr= "+arr);
                    //Do your Stuff or Set data
                }
            }
        }
  

这是输出= 08-11 16:51:29.830 17951-17951 / com.android.example   D / akshay:arr = [Akshay]

选项2:

Follow this有点复杂

选项3:

编写自己的自定义解析like this并相应地处理您的响应

答案 1 :(得分:0)

json可以具有单个结构。从代码中可以明显看出,密钥是由两种类型的数据给出的

理想情况下,当没有项目时,不应给出""。它应该为 null

请更改数据

如果没有项目,

"des_facet"=null // this is the change on server side. No need to change it on app side

如果有物品

"des_facet"=[
    "Workplace Environment"
  ]

代替

如果没有项目,

"des_facet"=""

如果有物品

"des_facet"=[
    "Workplace Environment"
  ]

答案 2 :(得分:0)

您可以将gson@AutoValue public abstract class NewsResponse{ public static TypeAdapter<NewsResponse> typeAdapter(Gson gson){ return new AutoValue_NewsResponse.GsonTypeAdapter(gson); } @SerializedName("api_status") public abstract String apiStatus(); @SerializedName("api_text") public abstract String success(); @Nullable @SerializedName("errors") public abstract ErrorDetails errorDetails(); @SerializedName("news") public abstract List<NewsDetails> newsDetails(); } 插件一起使用,并将该字段标记为可空,这将通知Autovalue使该字段为可选。 AZ是一个示例,这是您的操作方式:

if(isset($_POST['save'])){ ...}

您必须同时导入两个文件,才能在AutoValueAutoValue Gson Plugin上看到有关导入的更多信息