programing

"True"(JSON)를 Python 등가 "True"(참)로 변환

testmans 2023. 3. 11. 08:44
반응형

"True"(JSON)를 Python 등가 "True"(참)로 변환

최근 사용하고 있는 Train status API에 의해 2개의 키 값 쌍이 추가되었습니다.(has_arrived, has_departed)JSON 오브젝트 안에 있기 때문에 스크립트가 크래시 됩니다.

다음은 사전입니다.

{
"response_code": 200,
  "train_number": "12229",
  "position": "at Source",
  "route": [
    {
      "no": 1,
      "has_arrived": false,
      "has_departed": false,
      "scharr": "Source",
      "scharr_date": "15 Nov 2015",
      "actarr_date": "15 Nov 2015",
      "station": "LKO",
      "actdep": "22:15",
      "schdep": "22:15",
      "actarr": "00:00",
      "distance": "0",
      "day": 0
    },
    {
      "actdep": "23:40",
      "scharr": "23:38",
      "schdep": "23:40",
      "actarr": "23:38",
      "no": 2,
      "has_departed": false,
      "scharr_date": "15 Nov 2015",
      "has_arrived": false,
      "station": "HRI",
      "distance": "101",
      "actarr_date": "15 Nov 2015",
      "day": 0
    }
  ]
}

당연히 다음과 같은 오류가 발생하였습니다.

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'false' is not defined

제가 틀리지 않았다면, 이것은 JSON 응답의 부울 값이false/true반면 Python은 인식합니다.False/True.주변에 다른 방법이 없을까요?

PS: JSON 응답 변환을 시도했습니다.has_arrived스트링하고 다시 부울값으로 변환하는 것.하지만 항상 얻을 수 있는 것은True문자열에 문자가 있는 경우 값을 지정합니다.난 여기 갇혔어.

Python의 객체 선언 구문은 Json 구문과 매우 유사하지만 서로 구별되고 호환되지 않습니다.또,True/true문제, 다른 문제가 있습니다(예: Json과 Python은 날짜를 매우 다르게 처리하고 Python은 작은 따옴표와 코멘트를 허용하지만 Json은 허용하지 않습니다.

해결방법은 이들을 같은 것으로 취급하는 것이 아니라 필요에 따라 한쪽에서 다른 쪽으로 변환하는 것입니다.

Python의 네이티브 json 라이브러리를 사용하여 문자열의 Json을 해석(읽기)하고 python 개체로 변환할 수 있으며 이미 설치되어 있습니다.

# Import the library
import json
# Define a string of json data
data_from_api = '{"response_code": 200, ...}'
data = json.loads(data_from_api)
# data is now a python dictionary (or list as appropriate) representing your Json

python 객체를 json으로 변환할 수도 있습니다.

data_as_json = json.dumps(data)

예:

# Import the json library
import json

# Get the Json data from the question into a variable...
data_from_api = """{
"response_code": 200,
  "train_number": "12229",
  "position": "at Source",
  "route": [
    {
      "no": 1, "has_arrived": false, "has_departed": false,
      "scharr": "Source",
      "scharr_date": "15 Nov 2015", "actarr_date": "15 Nov 2015",
      "station": "LKO", "actdep": "22:15", "schdep": "22:15",
      "actarr": "00:00", "distance": "0", "day": 0
    },
    {
      "actdep": "23:40", "scharr": "23:38", "schdep": "23:40",
      "actarr": "23:38", "no": 2, "has_departed": false,
      "scharr_date": "15 Nov 2015", "has_arrived": false,
      "station": "HRI", "distance": "101",
      "actarr_date": "15 Nov 2015", "day": 0
    }
  ]
}"""

# Convert that data into a python object...
data = json.loads(data_from_api)
print(data)

그리고 True/True 변환이 어떻게 이루어지는지를 보여주는 두 번째 예시를 보여 줍니다.인용문의 변경사항과 코멘트의 삭제 방법에 대해서도 주의해 주십시오.

info = {'foo': True,  # Some insightful comment here
        'bar': 'Some string'}

# Print a condensed representation of the object
print(json.dumps(info))

> {"bar": "Some string", "foo": true}

# Or print a formatted version which is more human readable but uses more bytes
print(json.dumps(info, indent=2))

> {
>   "bar": "Some string",
>   "foo": true
> }

값을 사용하여 부울에 캐스트할 수도 있습니다.예를 들어, 데이터가 "json_data"라고 불리는 경우:

value = json_data.get('route')[0].get('has_arrived') # this will pull "false" into *value

boolean_value = bool(value == 'true') # resulting in False being loaded into *boolean_value

일종의 해키이지만, 작동한다.

하는 대신에eval정답에 대해서는 모듈을 사용합니다.

Python의 부울값을 int, str, list 등에 활용할 수 있습니다.

예를 들어 다음과 같습니다.

bool(1)     # True
bool(0)     # False

bool("a")   # True
bool("")    # False

bool([1])   # True
bool([])    # False

Json 파일에서 다음을 설정할 수 있습니다.

"has_arrived": 0,

그러면 Python 코드로

if data["has_arrived"]:
    arrived()
else:
    not_arrived()

여기서의 문제는 False로 표시된0과 그 값을 0으로 혼동하지 않는 것입니다.

"""
String to Dict (Json): json.loads(jstr)
Note: in String , shown true, in Dict shown True
Dict(Json) to String: json.dumps(jobj) 
"""    
>>> jobj = {'test': True}
>>> jstr = json.dumps(jobj)
>>> jobj
{'test': True}
>>> jstr
'{"test": true}'
>>> json.loads(jstr)
{'test': True}

파일을 읽고 있는 분들에게 도움이 될 만한 것을 하나 더 추가하고 싶습니다.

with open('/Users/mohammed/Desktop/working_create_order.json')as jsonfile:
            data = json.dumps(jsonfile.read())

그런 다음 에서 수락한 답변을 따르십시오.

data_json = json.loads(data)

{ "값":False } 또는 { "key": false }은(는) 올바른 json https://jsonlint.com/이 아닙니다.

json.loads는 피톤 부울 타입(False, True)을 해석할 수 없습니다.Json은 작은 글씨로 거짓, 진실하고 싶어 한다.

솔루션:

python_json_string.replace(": True", ": true", .replace(": False", ": false")

언급URL : https://stackoverflow.com/questions/33722662/converting-true-json-to-python-equivalent-true

반응형