Json String Parsing 在从 MSDOS 运行时有效,但在 Windows 上的 Ubuntu 上的 Bash 中无效 [重复]

Posted

技术标签:

【中文标题】Json String Parsing 在从 MSDOS 运行时有效,但在 Windows 上的 Ubuntu 上的 Bash 中无效 [重复]【英文标题】:Json String Parsing works while running from MSDOS but not in Bash on Ubuntu on Windows [duplicate] 【发布时间】:2019-10-01 11:12:36 【问题描述】:

当我从 Windows 命令提示符运行 python 脚本时,它运行良好,但从 Ubuntu 运行时会抛出错误,提示“JSON 对象必须是 str,而不是 'bytes'”。

在调用函数“print_out”时,为什么相同的输入(来自 RabbitMQ API 调用的结果)会受到不同的处理,这非常令人费解。

下面是python脚本的sn-p代码:-

import urllib.request, urllib.error, urllib.parse, requests
import json, optparse

class http_worker:

    def authentication(self, url, user, pw):
        password_manager = urllib2.HTTPPasswordMgrWithDefaultRealm() 
        password_manager.add_password(None, url, user, pw)

        self.auth = urllib2.HTTPBasicAuthHandler(password_manager) 
        opener = urllib2.build_opener(self.auth) 
        urllib2.install_opener(opener)

    def call_url(self, url, body_raw):
        body = json.dumps(body_raw)
        #
        # urllib2 post since there is body 
        #
        req = urllib2.Request(url, body, 'Content-Type': 'application/json')
        return urllib2.urlopen(req)


# THIS FUNCTION CALL IS THROWING ERROR
def print_out(my_json):
    for item in my_json:
        out = []
        for _, val in sorted(item.get("properties").get("headers").items()):
            out.append(str(val))
        print(", ".join(out))


user = "guest"
pwd = "guest"
rabbit_host = "http://localhost:15672"
host_suffix = "/api/queues/%%2F/%s/get" %(rabbit_queue_name)

url = rabbit_host + host_suffix
body_raw = "count":5000,"ackmode":"ack_requeue_false", "encoding":"auto","truncate":50000

worker = http_worker()
worker.authentication(url, user, pwd)
res = worker.call_url(url, body_raw)
#result = json.loads(res.read())
print_out(json.loads(res.read()))

【问题讨论】:

你真的是说 MSDOS,运行在不到 1MB 的操作系统吗? 那么不要使用那个名字。命令提示符只是命令提示符。它不托管应用程序,也不提供任何类型的运行时环境。你的意思是你在 Windows 上执行了一个 Python 脚本 你是如何运行脚本的,你是如何将 JSON 字符串传递给该方法的?该错误抱怨输入是字节缓冲区而不是字符串。 问题必须是独立的。允许提供信息链接,但如果无法回答问题(这通常意味着:“如果无法重现问题”)仅使用直接提供的信息而不遵循任何链接,则它有资格被关闭为不完整。请参阅minimal reproducible example 指南,以及相关关闭原因的准确文本。 坦率地说,str-vs-bytes 的区别根本不是 JSON 特定的。您的两个环境中可能有两个不同的 Python 版本(一个是 python2,另一个是 python3 f/e)。 【参考方案1】:

所以,这是特定于 python 版本的错误,与环境无关。为了执行我的脚本,我正在使用 python.exe(它将我带到 python3)而不是仅在 Windows 上的 Ubuntu 上的 Bash 中使用 python。查尔斯·达菲指出:-

坦率地说,str-vs-bytes 的区别根本不是 JSON 特定的。您的两个环境中可能有两个不同的 Python 版本(一个是 python2,另一个是 python3 f/e)。 ——查尔斯·达菲

【讨论】:

以上是关于Json String Parsing 在从 MSDOS 运行时有效,但在 Windows 上的 Ubuntu 上的 Bash 中无效 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

Flutter JSON Array Parsing getting error : Exception: type '(dynamic) => xxx is not a subtype of

Json, Java, Parsing(如何只获取json的一部分

Android Retrofit Json Parsing(部分json动态)

glibc: Parsing a Template String 如何解析printf格式化

Unexpected end of JSON input while parsing near

Objc live Json Parsing Only 显示 1 项错误