मैं इस तरह JSON ऑब्जेक्ट्स के संग्रह को पार्स करने का प्रयास कर रहा हूं:

{
"stage": [
{
"name": "Stage 1",
"weeks": [
{
 "name": "Week 1",
 "matches": [
  {
   "teams": [
    {
     "name": "San Francisco Shock",
     "score": "0",
     "score_url": "https://overwatchleague.com/matches/10223"
    },
    {
     "name": "Los Angeles Valiant",
     "score": "4",
     "score_url": "https://overwatchleague.com/matches/10223"
    }
   ]
  },
  {
   "teams": [
    {
     "name": "Shanghai Dragons",
     "score": "0",
     "score_url": "https://overwatchleague.com/matches/10224"
    },
    {
     "name": "Los Angeles Gladiators",
     "score": "4",
     "score_url": "https://overwatchleague.com/matches/10224"
    }
   ]
  },
  {
   "teams": [
    {
     "name": "Dallas Fuel",
     "score": "1",
     "score_url": "https://overwatchleague.com/matches/10225"
    },
    {
     "name": "Seoul Dynasty",
     "score": "2",
     "score_url": "https://overwatchleague.com/matches/10225"
    }
   ]
  },

आदि आदि।

मैं इसे एक प्रारूप में लाने की कोशिश कर रहा हूं कि एक और भाषा जो JSON के लिए सुपर फ्रेंडली नहीं है, इसे कुछ इस तरह से संघनित करके अधिक आसानी से संभाल सकती है:

{"matches":
    [
     {
      "team1": "San Francisco Shock",
      "t1score": "0",
      "team2": "Los Angeles Valiant",
      "t2score": "4"
     },
     { ... }
    ]
}

मैं इसे पूरा करने के लिए इस jq फ़िल्टर का उपयोग करने का प्रयास कर रहा हूं:

jq '.stage[] | {matches: [{team1: .weeks[].matches[].teams[0].name, t1score: 
.weeks[].matches[].teams[0].score, team2: .weeks[].matches[].teams[1].name, 
t2score: .weeks[].matches[].teams[1].score}]}'

इसके साथ मुद्दा यह है कि यह "नाम" कुंजी के हर उदाहरण से मेल खाता है, "सैन फ्रांसिस्को शॉक" मान के साथ "मैचों" सरणी में स्कोर और नामों के सभी क्रमपरिवर्तन के खिलाफ। मैं jq के लिए काफी नया हूं, लेकिन मुझे लगता है कि ऐसा इसलिए हो रहा है क्योंकि मैं इसे केवल "सप्ताह" और "मैचों" में सभी तत्वों को फ़िल्टर के माध्यम से मैप करने के लिए कह रहा हूं। क्या यह सही है? और एक फ़िल्टर क्या होगा जिसने वास्तव में वही किया जो मैं कोशिश कर रहा हूं और जैसा दिखता हूं? मुझे फ़िल्टर को "टीम" सरणी के दायरे से बाहर मिलान करने से रोकने का एक आसान तरीका नहीं मिला है।

0
hrestey 8 अक्टूबर 2018, 00:11

1 उत्तर

सबसे बढ़िया उत्तर

चाल .weeks[] इटरेटर को आगे "खींचना", और map को .matches सरणी पर "खींचना" है:

.stage[]
|.weeks[]
| {matches:
    (.matches
     | map({team1:   .teams[0].name,
            t1score: .teams[0].score,
            team2:   .teams[1].name, 
            t2score: .teams[1].score }) ) }

उत्पादन

{
  "matches": [
    {
      "team1": "San Francisco Shock",
      "t1score": "0",
      "team2": "Los Angeles Valiant",
      "t2score": "4"
    },
    {
      "team1": "Shanghai Dragons",
      "t1score": "0",
      "team2": "Los Angeles Gladiators",
      "t2score": "4"
    },
    {
      "team1": "Dallas Fuel",
      "t1score": "1",
      "team2": "Seoul Dynasty",
      "t2score": "2"
    }
  ]
}
1
peak 8 अक्टूबर 2018, 01:37