Djam36
@Djam36

Golang как распарсить Json массив внутри kson массива?

Привет, пытаюсь расспарсить верхнеуровневый json массив который внутри себе содержит массив но получаю в итоге пустые структуры, помогите пожалуйста
[{
	"code": {
	- Может называться как угодно "Serv": [{
			"field1": 0,
			"field2": 1399,
			"field3": "Z",
			"field4": 464,
			"field5": "O",
			"field6": 0000000000,
			"field7": "ASSFSW",
			"field8": "Ser",
			"field9": "",
			"field10": "C",
			"field11": {},
			"field12": "",
			"field13": 1,
			"field14": "",
			"field15": "Stop",
			"field16": "A",
			"field17": 0000000000
		}],
	- Может называться как угодно	"Serv1": [{
			"field1": 0,
			"field2": 1400,
			"field3": "",
			"field4": 464,
			"field5": "O",
			"field6": 0000000000,
			"field7": "ASSFSWxxx",
			"field8": "Ser",
			"field9": "",
			"field10": "C",
			"field11": {
				"field11.1": {
					"field11.2": "N"
				}
			},
			"field12": "",
			"field13": 1,
			"field14": "",
			"field15": "Stop2",
			"field16": "A",
			"field17": 000000121
		}]
	},
	"Code.field1": "0000000000",
	"Code.field2": "05AUTOSP"
}
]

Поля Serv и Serv1 могут называть по разному, мне и нужно достать их структуру из JSON
package main

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

type Result struct {
	Codes []Codes1
}

type Codes1 struct {
	Codes []Codes
}

type Codes struct {
	Filed1        string `json:"field1"`
	Filed2          string `json:"field2"`
	Filed3 string `json:"field3"`
}
const body = `[{
	"code": {
		"Serv": [{
			"field1": 0,
			"field2": 1399,
			"field3": "Z",
			"field4": 464,
			"field5": "O",
			"field6": 0000000000,
			"field7": "ASSFSW",
			"field8": "Ser",
			"field9": "",
			"field10": "C",
			"field11": {},
			"field12": "",
			"field13": 1,
			"field14": "",
			"field15": "Stop",
			"field16": "A",
			"field17": 0000000000
		}],
		"Serv1": [{
			"field1": 0,
			"field2": 1400,
			"field3": "",
			"field4": 464,
			"field5": "O",
			"field6": 0000000000,
			"field7": "ASSFSWxxx",
			"field8": "Ser",
			"field9": "",
			"field10": "C",
			"field11": {
				"field11.1": {
					"field11.2": "N"
				}
			},
			"field12": "",
			"field13": 1,
			"field14": "",
			"field15": "Stop2",
			"field16": "A",
			"field17": 000000121
		}]
	},
	"Code.field1": "0000000000",
	"Code.field2": "05AUTOSP"
}
]`
func main() {
	resalt := make([]Result, 0)
	decoder := json.NewDecoder(bytes.NewBufferString(body))
	err := decoder.Decode(&resalt)
	if err != nil {
		panic(err)
	}
	fmt.Println(resalt[0])
}

Уже как только не делал, всегда получаю
[{[]} {[]} {[]} {[]} {[]} {[]} {[]} {[]} {[]} {[]} {[]} {[]} {[]} {[]}]

Натолкните на мысль что не так? Мне нужно именно достать все JSON которые приходят в массиве code
  • Вопрос задан
  • 187 просмотров
Решения вопроса 1
Во-первых, ваш json невалиден. Если его исправить и исправить описания структур, то получится
примерно так
package main

import (
	"encoding/json"
	"fmt"
)

type Codes1 struct {
	Codes map[string][]Codes `json:"code"`
}

type Codes struct {
	Filed1 int    `json:"field1"`
	Filed2 int    `json:"field2"`
	Filed3 string `json:"field3"`
}

const body = `[
  {
    "code": {
      "Serv": [
        {
          "field1": 0,
          "field2": 1399,
          "field3": "Z",
          "field4": 464,
          "field5": "O",
          "field6": 0,
          "field7": "ASSFSW",
          "field8": "Ser",
          "field9": "",
          "field10": "C",
          "field11": {},
          "field12": "",
          "field13": 1,
          "field14": "",
          "field15": "Stop",
          "field16": "A",
          "field17": 0
        }
      ],
      "Serv1": [
        {
          "field1": 0,
          "field2": 1400,
          "field3": "",
          "field4": 464,
          "field5": "O",
          "field6": 0,
          "field7": "ASSFSWxxx",
          "field8": "Ser",
          "field9": "",
          "field10": "C",
          "field11": {
            "field11.1": {
              "field11.2": "N"
            }
          },
          "field12": "",
          "field13": 1,
          "field14": "",
          "field15": "Stop2",
          "field16": "A",
          "field17": 121
        }
      ]
    },
    "Code.field1": "0000000000",
    "Code.field2": "05AUTOSP"
  }
]`

func main() {
	var result []Codes1
	err := json.Unmarshal([]byte(body), &result)
	if err != nil {
		panic(err)
	}
	fmt.Println(result)
}


https://play.golang.org/p/LB0TsM2a7Ai
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы