properties
아래와 같이 Customer.json 파일의 키 아래에 json 매핑이 있습니다.
{
"customer": {
"properties": {
"customerId": {
"type": "string",
"index": "not_analyzed"
},
"name": {
"type": "string",
"index": "not_analyzed"
}
}
}
}
위의 매핑을 사용 key
하여 displayName
복사하고 다음과 같이 변환하고 싶습니다 .type
field(key: 'customerId', displayName: 'customerId', type: 'String')
field(key: 'name', displayName: 'name', type: 'String')
치고 시도했는데배쉬 + 파이썬아래와 같이 먼저 클라이언트 키를 가져오고 속성 내부에서 루프를 반복한다고 가정합니다.
$ cat Customer.json | python -c 'import sys; import simplejson as json; \
print "\n".join( [i["properties"] for i in json.loads( sys.stdin.read() )["customer"]] )'
Traceback (most recent call last):
File "<string>", line 2, in <module>
TypeError: string indices must be integers, not str
다른 솔루션에도 열려 있습니다.
답변1
이러한 구조화된 데이터를 구문 분석하는 것은 이전처럼 전용 구문 분석기를 사용하여 수행하는 것이 가장 좋습니다. 그러나 이 특별한 경우에는 다음을 수행할 수 있습니다.
$ grep -B 1 '"type":' Customer.json | tr $'"' $"'" | sed 's/[:,]//g' |
awk '{print "field(key: "$1",\tdisplayName: "$1",\t type: "$NF")"}' RS="--"
반품:
field(key: 'customerId', displayName: 'customerId', type: 'string')
field(key: 'name', displayName: 'name', type: 'string')
답변2
for
오류는 나에게 분명해 보입니다. 루프가 "고객" 사전/맵의 값을 반복하기 때문에 변수 "i"는 문자열입니다 . 값은 사전/맵 자체이며, 이를 반복하면 키 목록(예: ["속성"])이 상속됩니다.
cat Customer.json | python -c 'import sys; import simplejson as json; \
print "\n".join( [i for i in json.loads( sys.stdin.read() )["customer"]["properties"] ] )'
당신에게 줄 것이다
customerid
name
다음을 수행하면 목표에 더 가까워질 수 있습니다.
cat Customer.json | python -c 'import sys; import simplejson as json; \
print "\n".join( ["{} {}".format(k, v) for k,v in json.loads( sys.stdin.read() )["customer"]["properties"].iteritems() ] )'
이것은 만든다:
customerId {'index': 'not_analyzed', 'type': 'string'}
name {'index': 'not_analyzed', 'type': 'string'}
거기에서 실제로 스크립트에서 Python을 생성하는 것이 좋습니다. 추가 서식 지정 방법 string
과 수행 방법을 결정해야 합니다 String
. 여러 줄은 항상 디버깅하기 쉽고(귀하의 질문에 설명된 사례) 유지 관리가 가능하며 더 의미 있는(줄 번호) 오류 메시지를 제공합니다.
답변3
그리고 jq
:
jq -r '.customer.properties | to_entries[] |
"field(key: \u0027\(.key)\u0027, displayName: \u0027\(.key)\u0027, type: \u0027\(.value.type)\u0027)"' Customer.json
그러면 값이 properties
키와 . 각각은 키 값(즉, 합계)을 가지며, 각각은 하위 개체의 값을 갖습니다.key
value
key
properties
customerId
name
value
properties
이러한 항목이 있으면 해당 항목의 key
값과 값을 추출하여 텍스트 문자열 템플릿에 삽입합니다. 문자열에 표시되는 모든 문자는 작은따옴표 문자입니다.type
value
\u0027
예제 입력 파일이 주어지면 출력은 다음과 같습니다.
field(key: 'customerId', displayName: 'customerId', type: 'string')
field(key: 'name', displayName: 'name', type: 'string')