【问题标题】:JsonArray as empty string parsing issue with retrofitJsonArray 作为空字符串解析问题与改造
【发布时间】:2019-01-18 18:53:24
【问题描述】:

我有一个 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中实现吗?

【问题讨论】:

  • 您想在设置数据为空或为空时处理?
  • @AkshayKatariya :我从服务器收到此响应,我需要使用改造和 gson 在 android 中解析它。
  • 您使用的是自定义解析还是GsonConverterFactory ?
  • 当您使用 Retrofit 时,您的响应应该有一种格式。它应该始终是一个数组。
  • @AkshayKatariya:是的,我正在使用 GsonConverterFactory

标签: android gson retrofit


【解决方案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 并相应地处理您的响应

【讨论】:

    【解决方案2】:

    一个 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"
      ]
    

    【讨论】:

    • 从未提及“无法更改服务器”。这是 API/JSON 创建的标准方式。即使以一种骇人听闻的方式,这种情况也无法从应用程序端修复。因为即使是 Object 类也不能与数组或 List 映射,因为它们是接口。所以我看不出有任何方法可以在应用端处理这个问题。
    • 亲爱的总有办法看看我的回答,我在app端处理的
    【解决方案3】:

    您可以将AutoValuegson 插件一起使用,并将该字段标记为可为空,这将通知自动值使该字段成为可选。 AZ 举个例子,你就是这样做的:

    @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();
    }
    

    您必须同时导入它们,查看有关导入的更多信息:AutoValueAutoValue Gson Plugin

    【讨论】:

      猜你喜欢
      • 2016-05-02
      • 2012-01-11
      • 2015-06-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多