我有一个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中实现吗?
答案 0 :(得分: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]
Follow this有点复杂
编写自己的自定义解析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'])){ ...}
您必须同时导入两个文件,才能在AutoValue和AutoValue Gson Plugin上看到有关导入的更多信息