2016-08-18 4 views
0

Die Daten, die ich habe, sind xlsx Zeilen in diesem Format: Zeile 1 Wert 1 ist die erste Zelle (A1), Zeile 1 Wert 2 ist die zweite Zelle (B1) usw. Jede Zelle kann (aber doesn (müssen nicht) Stile enthalten, z Border, Fill etc. .Styles werden in geschweiften Klammern wie in diesen Daten sein: [[["row 1 value 1",{"Border":null,"Fill":{"arrFill":{"BgColor":"red"}},"Font":null,"ApplyBorder":null}],"row 1 value 2","row 1 value 3"],["row 2 value 1","row 2 value 2","row 2 value 3"]]Unmarshal json optionales Element Golang

Wie entmarshale diese Daten, um auch die nicht notwendige Style Map zu bekommen?

Playground

+0

Nicht zu bekommen, was json unmarshalling hat mit Excel-Dateien zu tun, aber Sie clould einen Zeiger Definition in Ihrer Struktur für den Stil Teil verwenden. Wenn dies nicht der Fall ist, wurde es nicht demaskiert. – Sascha

+0

Es spielt keine Rolle, ob es Excel ist oder nicht, ich brauche nur eine Möglichkeit, solche Daten zu entpacken. – kingSlayer

+1

Wenn es nicht mit dem Problem zu tun hat, das Sie zu lösen versuchen, dann erwähnen Sie es nicht, da dies die Frage leichter verständlich macht. Ansonsten ist der Vorschlag mit der Zeigervariable gültig, ich benutze diesen Ansatz für die Rückprogrammierung von YAML-Dateien mit optionalen Elementen. – Sascha

Antwort

0

Sie müssen möglicherweise die reflektieren Paket verwenden Datentypen in dem sich ergebenden Array/Karte zu überprüfen. Es sieht langweilig aus, scheint aber der einzige Ausweg zu sein. Ich habe unten ein paar schnellen und Schmutz klebt, aber runnable Code das gleiche zu veranschaulichen:

package main 

import (
    "encoding/json" 
    "fmt" 
    "reflect" 
) 

func parsePrintArray(y interface{}) { 
    var dummy []interface{} 
    var dummy2 map[string]interface{} 
    if reflect.TypeOf(y) == reflect.TypeOf("") { 
     fmt.Printf("%s ", y) 
     return 
    } 
    if reflect.TypeOf(y) == reflect.TypeOf(dummy2) { 
     x := y.(map[string]interface{}) 
     for ks, vi := range x { 
      fmt.Printf("\ndumping for key %s ", ks) 
      if vi != nil { 
       parsePrintArray(vi) 
      } 
     } 
     return 
    } 
    for k, yl := range y.([]interface{}) { 
     if reflect.TypeOf(yl) == reflect.TypeOf(dummy) { 
      fmt.Println("") 
      parsePrintArray(yl.([]interface{})) 
     } else if reflect.TypeOf(yl) == reflect.TypeOf("") { 
      fmt.Printf("%v: %s ", k, yl.(string)) 
     } else if reflect.TypeOf(yl) == reflect.TypeOf(dummy2) { 
      x := yl.(map[string]interface{}) 
      for ks, vi := range x { 
       fmt.Printf("\ndumping for key %s ", ks) 
       if vi != nil { 
        parsePrintArray(vi) 
       } 
      } 
     } 
    } 
} 

func main() { 

    x := "[[[\"row 1 value1\",{\"Border\":null,\"Fill\":{\"arrFill\":{\"BgColor\":\"red\"}},\"Font\":null,\"ApplyBorder\":null}],\"row 1 value2\",\"row 1 value 3\"],[\"row 2 value 1\",\"row 2 value 2\",\"row 2 value 3\"]]" 

    var y []interface{} 
    err := json.Unmarshal([]byte(x), &y) 
    if err != nil { 
     panic(err) 
    } 
    parsePrintArray(y) 
    fmt.Println("") 
} 
+0

Ich akzeptiere dies als die richtige Antwort, weil es mir geholfen hat, mein Problem zu verstehen. Ich habe das Parsen der Schnittstelle konditioniert. Danke. – kingSlayer

Verwandte Themen