JSON字符串没有得到正确的值返回错误

Posted

技术标签:

【中文标题】JSON字符串没有得到正确的值返回错误【英文标题】:JSON String not getting correct value returning error 【发布时间】:2017-06-20 21:24:05 【问题描述】:

我是服务器和 twilio 的新手,我已设置服务器以在我的本地主机上正确生成访问令牌。当我使用

生成令牌时
http://localhost/index.php?identity=bob&room=example

生成的令牌在 jwt 中,我得到了正确的令牌,因为如果我直接把它放在应用程序中,我会连接,但是当我尝试使用函数调用它时:

(void)retrieveAccessTokenFromURL:(NSString *)tokenURLStr
                    completion:(void (^)(NSString* token, NSError *err)) completionHandler 
NSURL *tokenURL = [NSURL URLWithString:tokenURLStr];
NSURLSessionConfiguration *sessionConfig = [NSURLSessionConfiguration defaultSessionConfiguration];
NSURLSession *session = [NSURLSession sessionWithConfiguration:sessionConfig];
NSURLSessionDataTask *task = [session dataTaskWithURL:tokenURL
                                    completionHandler: ^(NSData * _Nullable data,
                                                         NSURLResponse * _Nullable response,
                                                         NSError * _Nullable error) 
                                        NSError *err = error;
                                        NSString *accessToken;
                                        NSString *identity;
                                        if (!err) 
                                            if (data != nil) 
                                                NSDictionary *json = [NSJSONSerialization JSONObjectWithData:data
                                                                                                     options:NSJSONReadingAllowFragments
                                                                                                       error:&err];
                                                if (!err) 
                                                    accessToken = json[@"token"];
                                                    identity = json[@"identity"];
                                                    NSLog(@"Logged in as %@",identity);
                                                
                                            
                                        
                                        completionHandler(accessToken, err);
                                    ];
[task resume];

它会生成一个错误err -> NSError * domain: @"NSCocoaErrorDomain" - code: 3840 0x1559ef60,我检查了它对NSJSONReadingAllowFragments 说,但它仍然给我同样的错误,而直接放入相同的令牌时效果很好。如果有人可以帮助我,那就太好了。提前致谢。

编辑 1

这是生成的令牌:

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiIsImN0eSI6InR3aWxpby1mcGE7dj0xIn0.eyJqdGkiOiJTS2I2M2RjMzE2Yjc0ZDdhN2E0YzEyNjYzNDJlNTY2MTcwLTE0OTc5OTIzMTMiLCJpc3MiOiJTS2I2M2RjMzE2Yjc0ZDdhN2E0YzEyNjYzNDJlNTY2MTcwIiwic3ViIjoiQUM5ZTliNDYxZDI4NDkzZWY2ODYwNDMzYzViZWRkOTk0YyIsImV4cCI6MTQ5Nzk5NTkxMywiZ3JhbnRzIjp7ImlkZW50aXR5IjoiYm9iIiwidmlkZW8iOnsicm9vbSI6ImV4YW1wbGUifX19.Ppe85LeD8CFatGXkXgzaTR_ljznXIrpyrb8lu3SR4xo

我在 jwt.io 上查过

 HEADER:ALGORITHM & TOKEN TYPE


  "typ": "JWT",
  "alg": "HS256",
  "cty": "twilio-fpa;v=1"

PAYLOAD:DATA


  "jti": "SKb63dc316b74d7a7a4c1266342e566170-1497992313",
  "iss": "SKb63dc316b74d7a7a4c1266342e566170",
  "sub": "AC9e9b461d28493ef6860433c5bedd994c",
  "exp": 1497995913,
  "grants": 
    "identity": "bob",
    "video": 
      "room": "example"
    
  

VERIFY SIGNATURE
HMACSHA256(
  base64UrlEncode(header) + "." +
  base64UrlEncode(payload),
  
secret

) 

另外,当我直接给这个令牌时,连接工作,但通过 url 它不工作。

网站代码:

    <?php
include('./vendor/autoload.php');
include('./config.php');

use Twilio\Jwt\AccessToken;
use Twilio\Jwt\Grants\VideoGrant;

// Use identity and room from query string if provided
$identity = isset($_GET["identity"]) ? $_GET["identity"] : "identity";
$room = isset($_GET["room"]) ? $_GET["room"] :  "";

    
// Create access token, which we will serialize and send to the client
$token = new AccessToken(
    $TWILIO_ACCOUNT_SID, 
    $TWILIO_API_KEY, 
    $TWILIO_API_SECRET, 
    3600, 
    $identity
);

// Grant access to Video
$grant = new VideoGrant();
$grant->setRoom($room);
$token->addGrant($grant);

echo $token->toJWT();

【问题讨论】:

你能分享一下 PHP 服务器生成的 JSON 对象是什么样子的吗? 编辑更新有问题。谢谢 您是以字符串还是 JSON 对象的形式返回数据? 我使用的代码与 twilio 网站上用于 php 的快速入门教程中的代码相同。我也会为此更新代码 用 php 文件中的代码更新了代码 【参考方案1】:

这里是 Twilio 开发者宣传员。

在服务器端代码中,您返回的是一个简单的字符串,而不是 JSON。

您现在有两个选择。您可以将返回的data 转换为NSString,这将是您的令牌。但是,这不包括您当前正在记录的身份。要获取身份,您可以更改服务器的返回值以实际返回带有令牌和身份的 JSON。然后你的 JSON 解析代码应该可以工作了。

对于选项 1,您需要将 NSData 转换为 NSString。你应该可以这样做:

NSString *accessToken = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];

另一种方法是保留 JSON 解析代码并从服务器返回 JSON,请将 PHP 的最后几行更改为:

$grant = new VideoGrant();
$grant->setRoom($room);
$token->addGrant($grant);

$data = array('identity'=>$identity, 'token'=>$token->toJWT());
header('Content-type: application/json');
echo json_encode($data);

让我知道这是否有帮助。

【讨论】:

它只是在第二部分打印“数组”,里面什么都没有。抱歉对 php 不太熟悉 啊!我忘了一件事……对不起。这是我的错。等我编辑好后检查答案。 不用担心 :) 如果这已为您排序,您是否介意将其标记为正确,以便其他遇到此问题的人可以看到它确实有效。干杯! 啊,对不起,伙计.. 这么想把它标记了两次.. :) 已经完成了.. 再次感谢 :)

以上是关于JSON字符串没有得到正确的值返回错误的主要内容,如果未能解决你的问题,请参考以下文章

JSON解析

Flutter DistanceMatrix JSON 无法正确解析

这是一个正确的 JSON 字符串吗?

json 字符串 对象 互转

Json 没有以所需的模式返回正确的值

JSON 解析返回 null 到 iOS(json 字符串看起来正确)