V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
lixyz
V2EX  ›  Android

Android OKHttp 获取服务器的 Json 数据,没有双引号,请求是怎么回事儿?

  •  
  •   lixyz · 2021-01-26 04:41:59 +08:00 · 9642 次点击
    这是一个创建于 1428 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我服务器使用 SpringBoot 写的,如下:

        @GetMapping(value = "/GetImageByUser",produces = "application/json;charset=UTF-8")
        @ApiOperation("获取用户图片,每个分类前 100 张")
        @ApiImplicitParams({
                @ApiImplicitParam(name = "userId", value = "userId", dataType = "String", paramType = "query")
        }
        )
        public Result getImageByUser(String userId) {
            return imageService.getImageByUser(userId);
        }
    

    返回值 Result 对象如下:

    public class Result {
        private int code;
        private boolean message;
        private Object detail;
        ...省略 setter 和 getter 方法
    }
    

    然后在浏览器访问这个接口的时候,响应结果是带双引号的:

    {"code":200,"message":true,"detail":[{"category":{"objectId":"0c0a0ddaa1b84ce286be4343cd9d3438","categoryId":"c5341c1d8ac547589899514516d0768a","categoryName":"WeiXin","categoryUser":"84f6e0d8d94348ccab981e364661a419","isPrivate":-1,"categoryStatus":1,"createTime":3},"images":[{"objectId":"f6d97d24556348a4ac342cb321397718","imageId":"e50ba0a75359432f89390d85daefb10a","sha1":"c3063275501e0f8ef87703473c7263168771f21b","fileCategory":"c5341c1d8ac5475898
    省略...
    

    然后使用 Swagger 做调试的时候也是同样的效果。

    但是在 Android 端使用 OKHttp 访问接口的时候,json 的 key 和 value 都不带双引号:

    [{category={objectId=0c0a0ddaa1b84ce286be4343cd9d3438, categoryId=c5341c1d8ac547589899514516d0768a, categoryName=WeiXin, categoryUser=84f6e0d8d94348ccab981e364661a419, isPrivate=-1.0, categoryStatus=1.0, createTime=3.0}, images=[{objectId=f6d97d24556348a4ac342cb321397718, imageId=e50ba0a75359432f89390d85daefb10a, sha1=c3063275501e0f8ef87703473c7263168771f21b, 
    省略...
    

    因为 json 中有时候会含有网址,所以在解析 JSON 的时候就会出错。

    我感觉问题应该是出在 OKHttp 上,因为在浏览器是正常的(带双引号),使用 swagger 调试接口的时候也是正常的

    请问这个问题该如何解决啊?如何让 key 和 value 中的字符串都是带双引号的呢?

    grantonzhuang
        1
    grantonzhuang  
       2021-01-26 07:48:50 +08:00
    你这打印的不是 json,是 toString 方法打印出来的
    w292614191
        2
    w292614191  
       2021-01-26 08:35:27 +08:00
    OKHttp 可不会出这种低级错误。
    qwerthhusn
        3
    qwerthhusn  
       2021-01-26 08:37:56 +08:00
    目测 lz 新人,这个 JSON 已经反序列化成对象了,打印的是 toString 又不是 json
    uselessVisitor
        4
    uselessVisitor  
       2021-01-26 08:50:21 +08:00
    访问接口这个打出来的已经是反序列化的对象了,自然没有引号
    Helsing
        5
    Helsing  
       2021-01-26 09:18:08 +08:00 via iPhone
    找一个可以打印 json 的库,xlog 、logger 之类的
    hongch
        6
    hongch  
       2021-01-26 09:27:30 +08:00
    response.body.string 就是带双引号的
    kingfalse
        7
    kingfalse  
       2021-01-26 09:35:45 +08:00 via Android
    okhttp 直呼内行并表示你还是换个 HTTP 请求库吧
    yinzhili
        8
    yinzhili  
       2021-01-26 10:01:04 +08:00
    楼主需要补一补基础知识了
    Paaranoia
        9
    Paaranoia  
       2021-01-26 10:08:19 +08:00
    建议看看 okhttp 的文档
    scxiazi
        10
    scxiazi  
       2021-01-26 10:30:43 +08:00
    这打印的是对象
    amok
        11
    amok  
       2021-01-26 10:34:48 +08:00
    应该只是打印的问题,看看打印的代码是怎么写的,是否打印的 toString ?这里应该用拦截器打印 http 报文。
    Vegetable
        12
    Vegetable  
       2021-01-26 10:35:15 +08:00   ❤️ 2
    还建议看 okhttp 文档呢?这显然是需要重学 java 啊
    clf
        13
    clf  
       2021-01-26 10:47:03 +08:00
    这是 toString 出来的结果吧。看看有没有实体类自己输出 jsonStr 的方法。
    unco020511
        14
    unco020511  
       2021-01-26 11:18:07 +08:00
    你这是对象的 toSting(),不是 json
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5587 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 03:18 · PVG 11:18 · LAX 19:18 · JFK 22:18
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.