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格式化