Разбор Json в переменную в Голанге - PullRequest
0 голосов
/ 15 мая 2018

как мне разобрать этот json

[
  [
    [
      "Odio los lunes",
      "i hate mondays",
      null,
      null,
      1
    ]
  ],
  null,
  "en"
]

чтобы показать только Odio los lunes?

Ответы [ 3 ]

0 голосов
/ 15 мая 2018

Простой подход состоит в том, чтобы проанализировать документ JSON как interface{} («любой тип») и получить целевое значение строки путем утверждения проанализированной структуры. Например (игровая площадка) :

func main() {
  str := GetTargetString([]byte(jsonstr))
  fmt.Println(str) // => "Odio los lunes"
}

func GetTargetString(bs []byte) string {
  var doc interface{}
  if err := json.Unmarshal(bs, &doc); err != nil {
    panic(err)
  }
  return doc.([]interface{})[0].([]interface{})[0].([]interface{})[0].(string)
}

Функция «GetTargetString» будет паниковать, если данный фрагмент байта не содержит допустимый документ JSON или если структура документа не достаточно похожа (то есть массив, первый элемент которого является массивом, первый элемент которого массив, первый элемент которого является строкой).

Более идиоматическим (и в целом более безопасным) подходом будет проверка типов с использованием специальной формы с двумя возвращаемыми значениями утверждения типа и возвращение кортежа (string, error), например ::

.
if err := json.Unmarshal(jsonString, &result); err != nil {
  return "", err
}

array0, ok := doc.([]interface{})
if !ok {
  return "", fmt.Errorf("JSON document is not an array")
}

array1, ok := array0[0].([]interface{})
if !ok {
  return "", fmt.Errorf("first element is not an array")
}

// ...
0 голосов
/ 30 мая 2018

Это намного проще (и быстрее) с fastjson :

var p fastjson.Parser
v, err := p.Parse(input)
if err != nil {
    log.Fatal(err)
}
fmt.Printf("v[0][0][0]: %s", v.GetStringBytes("0", "0", "0"))
0 голосов
/ 15 мая 2018

Реализация unmarshalar для извлечения требуемого значения из вложенного массива и его разбора и структурирования с использованием unmarshal, например:

package main

import (
    "fmt"
    "encoding/json"
)

func(item *Result) UnmarshalJSON(data []byte)error{
    var v []interface{}
    if err:= json.Unmarshal(data, &v);err!=nil{
        fmt.Println(err)
        return err
    }
    item.Data = v[0].(interface{}).([]interface{})[0].([]interface{})[0].(string)
    return nil
}

type Result struct {
    Data string
}

func main() {
    var result Result
    jsonString := []byte(`[[["Odio los lunes", "i hate mondays", null, null, 1]], null, "en"]`)
    if err := json.Unmarshal(jsonString, &result); err != nil{
        fmt.Println(err)
    }
    //fmt.Printf("%+v\n",result)
    value := result.Data
    fmt.Println(value)
}

Пример игровой площадки

...