2017-06-28 3 views
0

In Zum reiht ich diese json zu analysieren haben:Convert json einzelnes Element-Arrays

{ 
    "response": [ 
    { 
     "message": [ 
     "hello world" 
     ], 
     "misc": [ 
     { 
      "timestamp": [ 
      "2017-06-28T05:52:39.347Z" 
      ], 
      "server": [ 
      "server-0101" 
      ] 
     } 
     ] 
    } 
    ] 
} 

Ich möchte ein Objekt in Go erhalten, die nicht alle unnötigen Arrays mit einer einzigen Zeichenfolge nicht enthalten . Der Quell-JSON wird niemals mehr als eine Zeichenfolge in jedem Array haben.

So ist das Endergebnis, dass ich diese json bekommen möchte sein:

{ 
    "response": { 
    "message": "hello world", 
    "misc": { 
     "timestamp": "2017-06-28T05:52:39.347Z", 
     "server": "server-0101" 
    } 
    } 
} 

oder ein gleichwertiges Objekt in Go.

Im Moment muss ich Response[0].Misc[0].Timestamp[0] verwenden, um auf die Daten zuzugreifen, die seltsam scheinen.

Antwort

0

Ich möchte ein Objekt in Go, das nicht alle unnötigen Arrays von mit einer einzigen Zeichenfolge enthält.

Der harte Weg: Parsen Sie die JSON von Hand (schreiben Sie unseren eigenen Parser).

Die sinnvolle Art und Weise: Abstellungs über Paket-Codierung/json in irgendeine Art Go die JSON oder in eine generischen interface{} und kopieren Sie die Stücke in einen anderen, einfacheren Go-Typen danach passen.

0

Sie können das Standardverhalten von json.Marshal/json.Unmarshal Methoden für eine Struktur außer Kraft gesetzt, durch seine eigenen MarshalJSON oder UnmarshalJSON richtig definieren.

Hier gibt es einen Auszug für den Code einer vereinfachten Version der Struktur, die Sie dekodieren müssen.

type Response struct { 
    Message string `json:"message"` 
} 

// UnmarshalJSON overrides the default behaviour for JSON unmarshal method. 
func (r *Response) UnmarshalJSON(data []byte) error { 
    auxResponse := &struct { 
     Message []string `json:"message"` 
    }{} 
    if err := json.Unmarshal(data, &auxResponse); err != nil { 
     return err 
    } 

    // Consider to add some checks on array length :) 
    r.Message = auxResponse.Message[0] 

    return nil 
} 

Sie können auf das vollständige Arbeitsbeispiel here zugreifen.

Ich empfehle Ihnen, dieses interessante article about custom JSON encode/decode with golang zu lesen.

0

Es ist wahrscheinlich am besten, einen eigenen Unmarshaller zu erstellen, aber dies ist ein schneller Weg, um zu simulieren, was Sie erreichen möchten.

package main 

import (
    "encoding/json" 
    "fmt" 
) 

// JSON ... 
var JSON = `{ 
    "response": [ 
    { 
     "message": [ 
     "hello world" 
     ], 
     "misc": [ 
     { 
      "timestamp": [ 
      "2017-06-28T05:52:39.347Z" 
      ], 
      "server": [ 
      "server-0101" 
      ] 
     } 
     ] 
    } 
    ] 
} 
` 

type rawObject struct { 
    Response []struct { 
     Message []string  `json:"message"` 
     Misc []interface{} `json:"misc"` 
    } `json:"response"` 
} 

type clean struct { 
    Message string     `json:"message"` 
    Misc map[string]interface{} `json:"misc"` 
} 

func main() { 
    var o rawObject 
    var c clean 
    // init map 
    c.Misc = make(map[string]interface{}) 

    // unmarshall the raw data 
    json.Unmarshal([]byte(JSON), &o) 

    for _, res := range o.Response { // I assume there should only be one response, don't know why this is wrapped as an array 
     // assume message is not really an array 
     c.Message = res.Message[0] 
     // convert []interface to map[string]interface 
     for _, m := range res.Misc { 
      for k, v := range m.(map[string]interface{}) { 
       c.Misc[k] = v 
      } 
     } 
    } 
    fmt.Printf("%+v\n", c) 
} 

Was i ist nicht über diese Antwort mag, dass es nicht sehr reusable..so eine Funktion sollte wahrscheinlich gemacht werden und mehr Fehlerprüfung (Teil eines benutzerdefinierten Unmarshaller schaffen). Wenn dies bei starker Produktion verwendet wird, kann es zu einigen Speicherproblemen kommen, da ich ein Rohobjekt erstellen muss, um ein clean Objekt zu erstellen. Aber als ein einziges Skript erledigt es die Aufgabe. Ich meine saubere Struktur fügt Antwort nicht als Typ hinzu, weil ich finde, dass es überflüssig ist.