Читая файл JSON в структуре пользовательских типов, мне нужно использовать ключи в функциях, которые ожидают строку типа, а не пользовательские типы - PullRequest
0 голосов
/ 11 ноября 2018

Я создаю инструмент, который может взять файл JSON, а затем создать из него PDF-файл, используя Go

Вот пример моего JSON:

[{"Name":"Ollie","Age":"25","Comment":"This is my comment"},{"Name":"Amy","Age":"28","Comment":"Another comment"},{"Name":"Joey","Age":"19","Comment":"Comment from Joey"},{"Name":"James","Age":"23","Comment":"James' comment"},{"Name":"Richard","Age":"20","Comment":"Richard has also made 24"}]

У меня есть кое-что, что работает от использования файлов CSV, но теперь я хочу иметь возможность принимать и файлы JSON

Пакет, который я использую для создания PDF-файлов: gofpdf

Одна из проблем заключается в том, что мне нужно передать JSON в структуру, чтобы прочитать ее, структура имеет свой собственный тип - поскольку я использую пользовательский тип, я не могу передать значения в функции gofpdf для сделать PDF

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

package main

import (
    "encoding/json"
    "fmt"
    "io/ioutil"
    "log"
    "time"

    "github.com/jung-kurt/gofpdf"
)

Вот моя структура:

type Person struct {
    Name    string `json:"Name"`
    Age     string `json:"Age"`
    Comment string `json:"Comment"`
}

func main() {

    data, err := ioutil.ReadFile("csv-to-json.json")
    if err != nil {
        fmt.Println(err)
    }

    //create variable people which is array of Person structs
    var People []Person

    //Take the data object (json file) and place into the People array of struct
    json.Unmarshal(data, &People)

    fmt.Println(People[:])

    pdf := NewReport()

    pdf = CreateTableJSON(pdf, People[:])

    if pdf.Err() {
        log.Fatalf("Failed creating PDF report: %s\n", pdf.Error())
    }

    err = SavePDFJSON(pdf)
    if err != nil {
        log.Fatalf("Cannot save PDF: %s|n", err)
    }
}

func CreateTableJSON(pdf *gofpdf.Fpdf, table []Person) *gofpdf.Fpdf {
    for _, str := range table {

Внизу, где я борюсь. str должен иметь тип string

        pdf.CellFormat(20, 7, str, "1", 0, "C", false, 0, "")

        pdf.Ln(-1)
    }
    return pdf
}

//Create function that generates a new pdf report
func NewReport() *gofpdf.Fpdf {
    pdf := gofpdf.New("P", "mm", "Letter", "")
    pdf.AddPage()
    pdf.SetFont("Arial", "B", 28)
    pdf.Cell(40, 10, "My title for the PDF (New)!")
    pdf.Ln(12)
    pdf.SetFont("Arial", "", 11)
    pdf.Cell(40, 10, time.Now().Format("Mon Jan 2, 2006"))
    pdf.Ln(12)

    return pdf
}


func SavePDFJSON(pdf *gofpdf.Fpdf) error {
    return pdf.OutputFileAndClose("pdf_from_json.pdf")
}

Так что я могу читать данные из файла JSON и выводить строки на консоль, но я не могу использовать эти данные в функциях генерации PDF, так как мне пришлось создавать собственные типы, и Параметры функции ожидают строки. Может кто-нибудь помочь мне здесь? Я хочу эквивалент этого:

pdf.CellFormat(20, 7, **TOSTRING(str)**, "1", 0, "C", false, 0, "")

Я уже 3 часа бездельничаю без удачи

Заранее спасибо

1 Ответ

0 голосов
/ 11 ноября 2018

Вам нужно реализовать (p *Person) String() string, чтобы вы могли получить строковое представление Person.

Например:

func (p *Person) String() string {
  return fmt.Sprintf("%s age %d says %q", p.Name, p.Age, p.Comment)
}

// ...
pdf.CellFormat(20, 7, str.String(), "1", 0, "C", false, 0, "")
...