2016-07-26 2 views
0

Я новичок в golang, мне нужно получить данные из следующей строки json.golang convert json, имеющий список массивов для структуры в glolang

{"data" : ["2016-06-21","2016-06-22","2016-06-25"], "sid" : "ab", "did" : "123"} 

Сейчас я попробовал-структуру с аналогичным

type IntervalData struct { 
    Data json.RawMessage `json:"data"` 
    Did string `json:"did"` 
    Sid string `json:"sid"` 
} 

type IntervalDataList []string 

и JSon маршализацией кодом как

r := IntervalData{} 
    json.Unmarshal([]byte(json), &r) 
    log.Printf("Raw Body: %s", r) 

    log.Printf("Raw Date Json: %s", r.Data) 

    blist := IntervalDataList{} 
    json.Unmarshal([]byte(r.Data), &blist) 
    log.Printf("Date List : %s", blist) 

Этим код только в состоянии получить SID и сделал из JSON строки не данные, которые показал, как пустую карту.
Что может быть для получения данных из json.

ОБНОВЛЕНИЕ: проблема решена. Я проверил свой вход json в формате {"data":"[\"dsadsdsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",\n\"sdsdadsddad\"]","did":"654646456","sid":"88683627434"}, который не является обязательной формой. Затем я проверил клиентский скрипт и вносил изменения в соответствии с онлайн-источниками. How to JSONize a uint8 slice in Go?

type RequestData struct { 
    Data JSONableSlice `json:"data"` 
    Did string `json:"did"` 
    Sid string `json:"sid"` 
} 
type JSONableSlice []uint8 

func (u JSONableSlice) MarshalJSON() ([]byte, error) { 
    var result string 
    if u == nil { 
     result = "null" 
    } else { 
     result = strings.Join(strings.Fields(fmt.Sprintf("%d", u)), ",") 
    } 
    return []byte(result), nil 
} 

func ApiRequest(w http.ResponseWriter, r *http.Request) { 
    sid := r.Header.Get("sid") 
    deviceID := r.Header.Get("deviceId") 

    body, err := ioutil.ReadAll(r.Body) 
    failOnError(err, "Issue faced during reading post contents") 
    data := RequestData{ 
     Data: body, 
     Sid: sid, 
     Did: dID, 
    } 

    bdata, err := json.Marshal(data) 

    // Some Rabbit MQ Connection code 

    // Rabbit MQ publish code 
    err = ch.Publish(
     "",  // exchange 
     q.Name, // routing key 
     false, // mandatory 
     false, // immediate 
     amqp.Publishing{ 
      DeliveryMode: amqp.Persistent, 
      ContentType: "text/plain", 
      Body:   bdata, 
    }) 
} 

Не так много изменений требуется в потребительском коде Теперь

type IntervalData struct { 
     //Data json.RawMessage `json:"data"` 
     Data []byte `json:"data"` 
     Did string `json:"did"` 
     Sid string `json:"sid"` 
    } 
    r := IntervalData{} 
    json.Unmarshal([]byte(json), &r) 
    log.Printf("Raw Body: %s", r) 

    log.Printf("Raw Date Json: %s", r.Data) 

    blist := IntervalDataList{} 
    json.Unmarshal(r.Data, &blist) 
    log.Printf("Date List : %s", blist) 
+0

https://github.com/antonholmquist/jason – pregmatch

+0

Может быть, я пропустил момент, но то, что говорит против, заявив 'IntervalData.Data' как' [] string'? https://play.golang.org/p/ken-wOlYBf – Havelock

ответ

1

В вашем примере код, который вы имеете в виду r.data который является неэкспортируемыми поле! Но ваш тип IntervalData имеет экспортIntervalData.Data раздел! Это противоречиво.

Так что, скорее всего, ваш IntervalData содержит неэкспортируемыхdata поля, которым json пакета игнорирует, только экспортируемые поля маршалируются/unmarshaled.

Просто измените поле IntervalData.data для экспорта: IntervalData.Data.

Смотрите этот рабочий пример:

j := `{"data" : ["2016-06-21","2016-06-22","2016-06-25"], "sid" : "ab", "did" : "123"}` 
r := IntervalData{} 
json.Unmarshal([]byte(j), &r) 
log.Printf("Raw Body: %s", r) 

log.Printf("Raw Data Json: %s", r.Data) 

blist := IntervalDataList{} 
json.Unmarshal([]byte(r.Data), &blist) 
log.Printf("Data List : %s", blist) 

Output (попробовать его на Go Playground):

2009/11/10 23:00:00 Raw Body: {["2016-06-21","2016-06-22","2016-06-25"] 123 ab} 
2009/11/10 23:00:00 Raw Data Json: ["2016-06-21","2016-06-22","2016-06-25"] 
2009/11/10 23:00:00 Data List : [2016-06-21 2016-06-22 2016-06-25] 

Также отметим, что json.RawMessage поле и второй демаршалинга ненужно, вы можете определить Data должно быть типа IntervalDataList, и оно работает с одним немаршалом:

Data IntervalDataList `json:"data"` 

И демаршалинга:

j := `{"data" : ["2016-06-21","2016-06-22","2016-06-25"], "sid" : "ab", "did" : "123"}` 
r := IntervalData{} 
json.Unmarshal([]byte(j), &r) 
log.Printf("Raw Data Json: %s", r.Data) 

Output (попробуйте это на Go Playground):

2009/11/10 23:00:00 Raw Data Json: [2016-06-21 2016-06-22 2016-06-25] 
+0

О, это ошибка ввода, у моего кода только переменная данных, а не данные, но интересный код работает в ссылке, которую вы указали. После большей проверки я обнаружил, что переменная json не является строковым типом, но [] uint8 type, (она исходит из ответа потребителя сообщения). –

+1

@ kuldeep.kamboj '[] uint8' - это то же самое, что и' [] byte', что и определяется 'json.RawMessage':' type RawMessage [] byte' – icza

0

Код ниже (или в https://play.golang.org/p/kQRE7xYjrz) разбирает строку JSON и извлекает/печатает Поле данных:

package main 

import (
    "encoding/json" 
    "fmt" 
) 

var data = []byte(`{"data" : ["2016-06-21","2016-06-22","2016-06-25"], "sid" : "ab", "did" : "123"}`) 

type IntervalDataList []string 

type IntervalData struct { 
    Data IntervalDataList `json:"data"` 
    Did string   `json:"did"` 
    Sid string   `json:"sid"` 
} 

func main() { 
    r := &IntervalData{} 
    err := json.Unmarshal(data, r) 
    if err != nil { 
     panic(err) 
    } 
    fmt.Printf("Data: %#v\n", r.Data) 
} 

Выход:

Data: main.IntervalDataList{"2016-06-21", "2016-06-22", "2016-06-25"} 
+0

Как точки icza, начальный код также работает, но Основная проблема - фактический json отличается от ожидаемого json, который добавляет двойные кавычки вокруг значения данных (и escape-котировки внутри тоже). –

Смежные вопросы