2 回答
TA贡献1895条经验 获得超7个赞
我会创建一个实现io.Reader
接口的结构,并使用该读取器作为翻译基础:您可以使用它来逐块获取 JSON 输入,并检测您何时使用需要更改的键,因此将其翻译苍蝇。
然后,您只需使用 aio.Copy
将整个文件读入另一个文件。
有关示例,请参阅text.transform包依赖关系图...
TA贡献1765条经验 获得超5个赞
您可以使用像megajson这样的流式 JSON 解码器:
// Transform 'title' strings into Title case
func TitleizeJSON(r io.Reader, w io.Writer) error {
buf := new(bytes.Buffer)
r = io.TeeReader(r, buf)
s := scanner.NewScanner(r)
var prevTok int
var prevPos int
wasTitle := false
titleField := []byte("title")
for {
// read the next json token
tok, data, err := s.Scan()
if err == io.EOF {
return nil
} else if err != nil {
return err
}
// calculate the position in the buffer
pos := s.Pos()
off := pos - prevPos
switch tok {
// if this is a string
case scanner.TSTRING:
// if the previous string before a : was 'title', then
// titlelize it
if prevTok == scanner.TCOLON && wasTitle {
// grab the first part of the buffer and skip
// the first ", the titleize the rest
data = buf.Bytes()[:off][1:]
copy(data, bytes.Title(data))
wasTitle = false
} else {
wasTitle = bytes.Equal(data, titleField)
}
}
// now send the data to the writer
data = buf.Bytes()
_, err = w.Write(data[:off])
if err != nil {
return err
}
// reset the buffer (so it doesn't grow forever)
nbuf := make([]byte, len(data)-off)
copy(nbuf, data[off:])
buf.Reset()
buf.Write(nbuf)
// for the next go-around
prevTok = tok
prevPos = pos
}
}
这应该可以即时进行标题化。我能想到的一个问题是,如果你有一个非常大的字符串。
- 2 回答
- 0 关注
- 179 浏览
添加回答
举报