2017-11-07 2 views
-4

Wie man die JSON entpacken und in Strukturen füllen. So wie ich Strukturen für den Kundenauftrag und den Verkaufsauftrag habe. In Json werde ich 1 Datensatz für den Verkauf und mehrere Artikel für die Struktur der Verkaufsdetails haben.wie json entmaren und in Strukturen in Golang füllen

Hier ist der Go-Code Ich habe versucht mit einzelnen Artikel und für mehrere Artikel, sondern nur für einzelne Datensatz für die Struktur der Verkaufsdetails arbeiten.

Gocode:

package main 

import (
    "encoding/json" 
    "fmt" 
) 

type Order struct { 
    SalesId    string `json:"sales_id"` 
    Customer string `json:"customer_name"` 
    TotalPrice string `json:"totalprice"` 
} 
type OrderDetails struct { 
    DetailId    string `json:"detail_id"` 
    SalesId    string `json:"sales_id"` 
    ItemName string `json:"item_name"` 
    Qty string `json:"qty"` 
    Price string `json:"price"` 
} 
type Temp struct { 

    Salesorder Order `json:"Salesorder"` 
    Salesorderdetails OrderDetails `json:"OrderDetails"` 
} 

func main() { 
    jsonByteArray := []byte(`[{"Salesorder":{"sales_id":"SOO1","customer_name":"CUST1","totalprice":"200"}, "OrderDetails":{"detailid":"1","sales_id":"SOO1","item_name":"ITEM1","qty":"2","price":"100"}}]`) 

    //if i use above json it is working and if i use below json its not working 
//jsonByteArray := []byte(`[{"Salesorder":{"sales_id":"SOO1","customer_name":"CUST1","totalprice":"200"}, "OrderDetails":{"detailid":"1","sales_id":"SOO1","item_name":"ITEM1","qty":"2","price":"100"},{"detailid":"2","sales_id":"SOO2","item_name":"ITEM2","qty":"3","price":"200"}}]`) 

    var temp []Temp 
    err := json.Unmarshal(jsonByteArray, &temp) 
    if err != nil { 
     panic(err) 
    } 
    fmt.Printf("%+v\n", temp) 
    fmt.Printf("%+v\n ", temp[0].Salesorder.SalesId) 
} 

Fehler bei Verwendung mehrerer Objekte:

panic: invalid character '{' looking for beginning of object key string 

Output, während sie mit Erfolg einen Artikel mit:

[{Salesorder:{SalesId:SOO1 Customer:CUST1 TotalPrice:200} Salesorderdetails:{SalesId:SOO1 ItemName:ITEM1 Qty:2 Price:100}}] 
SOO1 

Fiddle: in salesorderdetails mit Schlüssel aktualisiert

https://play.golang.org/p/klIAoNi18r

+1

Ihre JSON falsch ist. Der zweite Teil von OrderDetails ist ein Wert ohne Schlüssel, und ist kein Teil des Arrays – Alexey

+0

aktualisiert mit Schlüssel in der Struktur der Verkaufsdetails – user3136356

+1

Ich würde vorschlagen, eine JSON-Validator wie verwenden: https://jsonlint.com/ oder https://www.freeformatter.com/json-validator.html. Ich empfehle es auch nicht, ich schnappe mir einfach eins, wenn ich es brauche. – miltonb

Antwort

0

Versuchen Sie folgendes:

package main 

import (
    "encoding/json" 
    "fmt" 
) 

type Order struct { 
    SalesId  string `json:"sales_id"` 
    Customer string `json:"customer_name"` 
    TotalPrice string `json:"totalprice"` 
} 

type OrderDetails struct { 
    SalesId string `json:"sales_id"` 
    ItemName string `json:"item_name"` 
    Qty  string `json:"qty"` 
    Price  string `json:"price"` 
} 

type Temp struct { 
    Salesorder Order     `json:"Salesorder"` 
    Salesorderdetails []OrderDetails `json:"OrderDetails"` 
} 

func main() { 
    jsonByteArray := []byte(`[{"Salesorder":{"sales_id":"SOO1","customer_name":"CUST1","totalprice":"200"}, "OrderDetails":[{"sales_id":"SOO1","item_name":"ITEM1","qty":"2","price":"100"},{"sales_id":"SOO2","item_name":"ITEM2","qty":"3","price":"200"}]}]`) 

    var temp []Temp 

    err := json.Unmarshal(jsonByteArray, &temp) 
    if err != nil { 
     panic(err) 
    } 

    //fmt.Printf("%+v\n", temp) 

    // Printing all Orders with some details 
    for _, order := range temp { 
     fmt.Println("Customer:", order.Salesorder.Customer) 

     for _, details := range order.Salesorderdetails { 
      fmt.Printf(" ItemName: %s, Price: %s\n", details.ItemName, details.Price) 
     } 
    } 
} 

.. Orderdetails ein Array ist jetzt

+0

wie alle Elemente in der Struktur – user3136356

+0

welche Artikel zu drucken? Sie haben nur zwei Hauptschlüssel: Verkaufsauftrag und Bestelldetails. Zweite ist ein Array – Alexey

+0

Wie können wir OrderDetails drucken, wie man Schleife? um zum Beispiel salesid im mit fmt.Printf anzuzeigen ("% + v \ n", temp [0] .Vertriebsanhang.VerkaufsId) – user3136356

1

Was Sie binden zu dekodieren nicht gültig JSON ist. Dies wäre gültig:

{ 
    "Salesorder": { 
     "sales_id": "SOO1", 
     "customer_name": "CUST1", 
     "totalprice": "200" 
    }, 
    "OrderDetails": { 
     "sales_id": "SOO1", 
     "item_name": "ITEM1", 
     "qty": "2", 
     "price": "100" 
    } 
} 

Aber was Sie geben, ist dies:

{ 
    "Salesorder": { 
     "sales_id": "SOO1", 
     "customer_name": "CUST1", 
     "totalprice": "200" 
    }, 
    "OrderDetails": { 
     "sales_id": "SOO1", 
     "item_name": "ITEM1", 
     "qty": "2", 
     "price": "100" 
    }, 
    { // Things become invalid here 
     "sales_id": "SOO2", 
     "item_name": "ITEM2", 
     "qty": "3", 
     "price": "200" 
    } 
} 

Es sieht aus wie Sie eine Liste von Objekten zu geben versuchen, in diesem Fall können Sie diese Objekte wickeln müssen eckige Klammern [] oder Sie müssen dem zweiten Objekt OrderDetails einen eigenen Schlüssel geben.

+0

wie kann ich dann einen gültigen json geben? – user3136356

+0

Es ist wirklich unklar, was Sie für eine Ausgabe erwarten. Hat eine einzelne "SalesOrder" mehrere OrderDetails? – Tyler

+0

ja genau, single SalesOrder haben mehrere OrderDetails – user3136356