@linuxoid_inrus

Как добавить новый key value в JSON?

Есть JSON файл юзеров:
[
  {
    "id":1,
    "score": 335
  },
  {
    "id":2,
    "score": 123
  },
  {
    "id":3,
    "score": 321
  }
]


Получаю юзеров таким образом:
package main

import (
	"encoding/json"
	"fmt"
	"io/ioutil"
	"os"
)

func main(){
	file, err := os.Open("users.json")

	if err != nil {
		panic(err)
	}

	fileBytes, _ := ioutil.ReadAll(file)

	var data []map[string]interface{}

	json.Unmarshal(fileBytes, &data)

	fmt.Println(data)

}


Как добавить нового юзера в файл, если я не найду его по ID?
  • Вопрос задан
  • 158 просмотров
Решения вопроса 1
bitniks
@bitniks
Go/PHP/Symfony developer
Неясно, проблема в добавлении нового пользователя или в записи в файл

Если в добавлении, то можно сделать так:
package main

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

type User struct {
	ID int `json:"id"`
	Score int `json:"score"`
}

func main() {
	fileBytes := []byte(`[
  {
    "id":1,
    "score": 335
  },
  {
    "id":2,
    "score": 123
  },


  {
    "id":3,
    "score": 321
  }
]`)

	var users []User
	err := json.Unmarshal(fileBytes, &users)
	if err != nil {
		log.Fatalf("Failed to unmarshal: %s", err)
	}
	
	fmt.Printf("%#v\n", users)
	
	newUser := User{
		ID: 4, 
		Score: 1488,
	}
	
	users = addIfNotExist(users, newUser) 
	
	fmt.Printf("%#v\n", users)
	
	// Дальше Marshal и сохранение в файле
}

func addIfNotExist(users []User, user User) []User {
	for _, u := range users {
		if u.ID == user.ID {
			return users
		}
	}
	
	return append(users, user)
}

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

Продублирую рекомендации из комментария к вопросу:
1) Используйте для работы с данными структуры, а не map и пустые интерфейсы. Это идиоматически более близко к Golang и удобнее
2) Всегда обрабатывайте ошибки. Если функция ReadAll выкинула ошибку, нет смысла пытаться делать Unmarshal. И сложно понять, что произошло, когда ошибка замалчивается
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
dasha_programmist
@dasha_programmist
ex Software Engineer at Reddit TS/React/GraphQL/Go
1) добавить его в data
data["user2"]=...
2) сериализовать в байт-слайс json.Marshal
3) сохранить байт-слайс в файл
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы