পাইথন অভিধানকে JSON অ্যারে রূপান্তর করুন


100

বর্তমানে আমার কাছে এই অভিধানটি ব্যবহার করে মুদ্রিত হয়েছে pprint:

{'AlarmExTempHum': '\x00\x00\x00\x00\x00\x00\x00\x00',  
'AlarmIn': 0,  
'AlarmOut': '\x00\x00',  
'AlarmRain': 0,  
'AlarmSoilLeaf': '\x00\x00\x00\x00',  
'BarTrend': 60,  
'BatteryStatus': 0,  
'BatteryVolts': 4.751953125,  
'CRC': 55003,
'EOL': '\n\r',
'ETDay': 0,
'ETMonth': 0,
'ETYear': 0,
'ExtraHum1': None,
'ExtraHum2': None,
'ExtraHum3': None,
'ExtraHum4': None,
'ExtraHum5': None,
'ExtraHum6': None,
'ExtraHum7': None,
'ExtraTemp1': None,
'ExtraTemp2': None,
'ExtraTemp3': None,
'ExtraTemp4': None,
'ExtraTemp5': None,
'ExtraTemp6': None,
'ExtraTemp7': None,
'ForecastIcon': 2,
'ForecastRuleNo': 122,
'HumIn': 31,
'HumOut': 94,
'LOO': 'LOO',
'LeafTemps': '\xff\xff\xff\xff',
'LeafWetness': '\xff\xff\xff\x00',
'NextRec': 37,
'PacketType': 0,
'Pressure': 995.9363359295631,
'RainDay': 0.0,
'RainMonth': 0.0,
'RainRate': 0.0,
'RainStorm': 0.0,
'RainYear': 2.8,
'SoilMoist': '\xff\xff\xff\xff',
'SoilTemps': '\xff\xff\xff\xff',
'SolarRad': None,
'StormStartDate': '2127-15-31',
'SunRise': 849,
'SunSet': 1611,
'TempIn': 21.38888888888889,
'TempOut': 0.8888888888888897,
'UV': None,
'WindDir': 219,
'WindSpeed': 3.6,
'WindSpeed10Min': 3.6}

আমি যখন এটি করি:

import json
d = (my dictionary above)
jsonarray = json.dumps(d)

আমি এই ত্রুটি পেয়েছি: 'utf8' codec can't decode byte 0xff in position 0: invalid start byte


আপনার সমস্যাটি এখানে রয়েছে:\xff
— বেনজমিন তোয়েগ

উত্তর:


168

আপনি যদি আপনার জসন-এ-প্রিন্টযোগ্য চিহ্নগুলির সাথে ভাল থাকেন তবে কল ensure_ascii=Falseকরতে যুক্ত dumpsকরুন।

>>> json.dumps(your_data, ensure_ascii=False)

যদি ensure_asciiমিথ্যা হয়, তাহলে ফেরত মান একটি হতে হবে unicodeস্বাভাবিক পাইথন করার দৃষ্টান্ত বিষয় strথেকে unicode পরিবর্তে একটি হওয়া ASCII পালিয়ে হচ্ছে বলপ্রয়োগ নিয়ম str।


4
indent=nচমত্কার মুদ্রণের বিকল্পগুলিতে যুক্ত করুন, nফাঁকা স্থানগুলির সংখ্যা কোথায়
— আরটিএফ

17

নিশ্চিত_আএসসিআই = মিথ্যা সত্যই কেবল এই সমস্যাটিকে ডিকোডিং পর্যায়ে ফেলে দেয়:

>>> dict2 = {'LeafTemps': '\xff\xff\xff\xff',}
>>> json1 = json.dumps(dict2, ensure_ascii=False)
>>> print(json1)
{"LeafTemps": "����"}
>>> json.loads(json1)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.7/json/__init__.py", line 328, in loads
    return _default_decoder.decode(s)
  File "/usr/lib/python2.7/json/decoder.py", line 365, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
  File "/usr/lib/python2.7/json/decoder.py", line 381, in raw_decode
    obj, end = self.scan_once(s, idx)
UnicodeDecodeError: 'utf8' codec can't decode byte 0xff in position 0: invalid start byte

শেষ পর্যন্ত আপনি কোনও জেএসওএন নথিতে কাঁচা বাইট সংরক্ষণ করতে পারবেন না, সুতরাং আপনি এএসসিআইআই স্ট্রিং - যেমন বেস64 হিসাবে নির্বিচারে বৌদ্ধের ক্রমকে এনকোডিংয়ের কিছু উপায় ব্যবহার করতে চাইবেন।

>>> import json
>>> from base64 import b64encode, b64decode
>>> my_dict = {'LeafTemps': '\xff\xff\xff\xff',} 
>>> my_dict['LeafTemps'] = b64encode(my_dict['LeafTemps'])
>>> json.dumps(my_dict)
'{"LeafTemps": "/////w=="}'
>>> json.loads(json.dumps(my_dict))
{u'LeafTemps': u'/////w=='}
>>> new_dict = json.loads(json.dumps(my_dict))
>>> new_dict['LeafTemps'] = b64decode(new_dict['LeafTemps'])
>>> print new_dict
{u'LeafTemps': '\xff\xff\xff\xff'}

আপনি '
— ল্যাটিন

4
আপনি মনে করতে পারেন, তবে জসন ইউটিএফ -8 ব্যবহার করার জন্য নকশা করা হয়েছে।
— কার্ল নচেটেল

4
@ জেএসএবেস্টিয়ান: তুলনায় সত্যই, খুব অদক্ষ b64encode। উদাহরণস্বরূপ, 256 অক্ষরের স্ট্রিংয়ের জন্য s = ''.join(chr(i) for i in xrange(256)), len(json.dumps(b64encode(s))) == 346বনাম len(json.dumps(s.decode('latin1'))) == 1045।
— মার্টিনিউ

10

আপনি যদি পাইথন 2 ব্যবহার করেন তবে আপনার স্ক্রিপ্টের প্রথম লাইনে UTF-8 ফাইল এনকোডিং মন্তব্য যুক্ত করতে ভুলবেন না।

# -*- coding: UTF-8 -*-

এটি কিছু ইউনিকোড সমস্যা সমাধান করবে এবং আপনার জীবনকে আরও সহজ করবে।


2

একটি সম্ভাব্য সমাধান যা আমি ব্যবহার করি তা হল পাইথন 3 ব্যবহার করা। দেখে মনে হচ্ছে অনেকগুলি সমস্যা সমাধান হয়েছে।

দেরিতে উত্তরের জন্য দুঃখিত, তবে এটি ভবিষ্যতে লোকদের সহায়তা করতে পারে।

উদাহরণ স্বরূপ,

#!/usr/bin/env python3
import json
# your code follows

4
অবশ্যই, আপনি অভিশাপ ডান, পাইথন 3 অনেকগুলি এনকোডিংয়ের সমস্যা সমাধান করেছে। তবে সে প্রশ্নের উত্তর নয়। এটি স্পষ্টভাবে পাইথন -২.7 সহ ট্যাগ করা হয়েছে। সুতরাং আপনি যা বলছেন তা হ'ল: আপনার পুরানো গাড়িতে কোনও বিল্ট-ইন ভ্যাকুয়াম ক্লিনার নেই। সুতরাং দয়া করে আপনার পুরানো গাড়িতে ভ্যাকুয়াম ক্লিনার যোগ করার পরিবর্তে একটি নতুন গাড়ি কিনুন।
— কলিডিয়ার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.