Как настроить функцию отступа во время json.Маршал?

# #json #go #encoding-json-go

Вопрос:

Мы разработали API «экспорта», который позволяет пользователям загружать файл json с информацией. Json-это массив. Теперь мы сталкиваемся с небольшой дилеммой.

Звоните json.Marshal напрямую (без отступа, не так удобно для пользователя)

 [{"foo":"bar"},{"foo1":"bar1"}]
 

Позвоните json.MarshalIndent или json.Indent(dst, src, "", " ") (слишком большой отступ)

 [
  {
    "foo": "bar"
  },
  {
    "foo1": "bar1"
  }
]
 

Я хочу такого рода

 [
  {"foo": "bar"},
  {"foo1": "bar1"}
]
 

Есть какие-нибудь идеи?

Комментарии:

1. encoding/json может либо отступать, либо нет. Форматер, который бы понимал, почему вы произвольно хотите, чтобы некоторые строки были отформатированы, а другие-нет, был бы намного сложнее, чем то, что требуется в stdlib или, вероятно, в любой сторонней библиотеке. Вам придется написать свой собственный, если это важно для вашего варианта использования.

Ответ №1:

Если структура фиксирована, вы можете вручную закодировать ее следующим образом:

 func MarshalArray(in []Obj, out io.Writer) {
   io.WriteString(out,"[")
   for i,x:=range in {
       if i>0 {
         out.Write([]byte(","))
       }
       io.WriteString("n  ")
       data,_:=json.Marshal(x)
       io.Write(data)
   }
   io.WriteString(out,"n]")
}