如何从包含其他参数的响应中获取 JSON 对象列表

Posted

技术标签:

【中文标题】如何从包含其他参数的响应中获取 JSON 对象列表【英文标题】:How to get list of JSON objects from response including other parameter 【发布时间】:2019-10-05 18:43:49 【问题描述】:

我正在继续学习改造并希望处理来自服务器的响应。

Postman 的响应结构


    "succeeded": false,
    "errors": [
        
            "code":"DuplicateUserName",
            "description":"User name 'XXX' is already taken."
        ,
        
            "code": "PasswordTooShort",
            "description": "Passwords must be at least 6 characters."
        ,
        
            "code": "PasswordRequiresLower",
            "description": "Passwords must have at least one lowercase ('a'-'z')."
        ,
        
            "code": "PasswordRequiresUpper",
            "description": "Passwords must have at least one uppercase ('A'-'Z')."
        
    ]

POST 代码

Call<RegisterResponseModel> register(@Body UserJSONModel user);

注册响应模型

    private String succeeded;
    private ArrayList<String> errors;

我尝试使用 List、ArrayList 以及 String 和 evenn 序列化:

@SerializedName("errors")
@Expose

但无论尝试如何,我都会收到一些应该是 success=false 和错误列表的内容

‹      í˝`I–%&/mĘJőJ×ŕtˇ€`$Ř�@ěÁ�Íć’ěiG#)«*�ĘeVe]f@Ě흼÷Ţď˝÷Ţď˝÷ş;ťN'÷ß˙?\fdlöÎJÚÉž!€ŞČ?~|?"~ńGÍz:ÍóY>űčŃyV6ů裼®«şůčŃ÷~ńGÓj–ô裧ëUYLł6˙ŞÉëŮ"˙hôŃ,o¦u±j‹jI-đEş¤oŇŹ_eçă´hҬ¬ólvť¶ŮŰ|9ţč—|˙—

【问题讨论】:

【参考方案1】:

您可以使用 ArrayList 错误解析该 json;

import java.util.List;

公共类 RegisterResponseModel

private boolean succeded;
private List<Error> errors;

public boolean isSucceded() 
    return succeded;


public void setSucceded(boolean succeded) 
    this.succeded = succeded;


public List<Error> getErrors() 
    return errors;


public void setErrors(List<Error> errors) 
    this.errors = errors;


@Override
public String toString() 
    return "TestDTO [succeded=" + succeded + ", errors=" + errors + "]";

public class Error 

private String code;
private String description;

public String getCode() 
    return code;


public void setCode(String code) 
    this.code = code;


public String getDescription() 
    return description;


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


@Override
public String toString() 
    return "Error [code=" + code + ", description=" + description + "]";

【讨论】:

【参考方案2】:

不要像处理成功案例一样处理此案例。如果后端返回错误,您需要像错误一样处理它。 我像这样为 okHttp 使用自定义拦截器

class ErrorInterceptor : Interceptor 

@Throws(IOException::class)
override fun intercept(chain: Interceptor.Chain): Response 
    val request = chain.request()
    val response = chain.proceed(request)
    if (<Check is repsonce fail>) 
        val body = response.body()
        body?.let(::parseBackendError) ?: throw IOException("Body is null")
    
    return response


private fun parseBackendError(responseBody: ResponseBody) 
    <Parce your error list and throw exeption>
  

【讨论】:

【参考方案3】:

将此添加到您的发布方法@FormUrlEncoded

【讨论】:

以上是关于如何从包含其他参数的响应中获取 JSON 对象列表的主要内容,如果未能解决你的问题,请参考以下文章

如何从来自api响应的json字符串构造对象列表?

如何从片段中的 JSON 响应中的对象获取数据

如何从共享类到ViewController获取JSON响应数据?

如何从打字稿中的json响应中获取日期对象

Linq 从一个列表中获取对象,其中其他整数列表包含在第一个列表中

如何检查 json 对象是不是包含 <null>?