我一直在尝试使用Go使用Google App Engine及其数据存储区和前端的AngularJS构建一些简单的后端REST API。我能够让一切工作但编辑。而且我不确定为什么JSON没有正确解组。
STRUCT:
type Article struct {
Key int64 `json:"Key" datastore:"-"`
Title string
Text string `datastore:",noindex"`
Author string
Tags string
Posted time.Time
}
当我加载文章时,我使用数据存储区中的id值填充Key属性。示例:5593215650496512
我将该字段保存在表单的隐藏输入中,并通过HTTP Post将表单的内容作为JSON提交给Go后端。
在提交之前,我可以看到Key保持适当的值。这是表格:
<form name="articleForm" ng-submit="saveArticle(article)">
<fieldset>
<input type="hidden" name="key" ng-value="article.Key" />
<div class="form-group">
<input class="form-control" ng-model="article.Title" placeholder="Title" name="title" type="text" required autofocus />
<div class="alert alert-danger" ng-show="articleForm.Title.$invalid && articleForm.Title.$dirty">
<ul>
<li ng-show="articleForm.title.$error.required">this field is required</li>
</ul>
</div>
</div>
<div class="form-group">
<wysiwyg
name="text"
textarea-id="articleText"
textarea-class="form-control"
textarea-height="180px"
textarea-name="articleText"
ng-model="article.Text"
enable-bootstrap-title="true"
textarea-required>
</wysiwyg>
<div class="alert alert-danger" ng-show="articleForm.text.$invalid && articleForm.text.$dirty">
<ul>
<li ng-show="articleForm.text.$error.required">this field is required</li>
</ul>
</div>
</div>
<div class="form-group">
<tags-input ng-model="tags"></tags-input>
</div>
<button type="submit" ng-disabled="!articleForm.$valid" class="btn btn-primary">
Save Article
</button>
</fieldset>
</form>
http范围之前的$ scope.article对象:
作者:“马特雷德利” 关键:“5593215650496512” 发表时间:“2015-06-29T12:57:20.833525Z” 标签:“测试,太酷了” 文字:“Lorem ipsum dolor sit amet,consectetur adipiscing elit.Engger nec odio。Praesent libero.Sed cursus ante dapibus diam.Sed nisi.Nulla quis sem at nibh elementum imperdiet.Duis sagittis ipsum.Praesent mauris.Fusce nec tellus sed augue semper Porta.Mauris massa.Vestibulum lacinia arcu eget nulla。“ 标题:“第8条例”
但是,Key属性保持为0.我能够将该值作为单个id值传递,而没有删除和加载的问题。
仅加载id的代码(这是加载版本,它可以工作):
var id int64
json.Unmarshal(body, &id)
c.Infof("ID: %v", id)
key := datastore.NewKey(c, "Article", "", id, nil)
带有附加值的编辑代码(不起作用,id = 0):
var article Article
json.Unmarshal(body, &article)
c.Infof("Article:%g", article)
c.Infof("Body:" + string(body))
c.Infof("Key:%v", article.Key)
article.Posted = time.Now()
这是json.Unmarshal之后的结构转储:
2015/06/29 03:04:08 INFO:文章:{%!g(int64 = 0)%!g(字符串=示例第8条) %!g(string = Lorem ipsum dolor sit amet,consectetur adipiscing ELIT。整数nec odio。 Praesent libero。 Sed cursus ante dapibus diam。 塞德尼斯。 Nulla quis sem at nibh elementum imperdiet。 Duis sagittis 存有。 Praesent mauris。 Fusce nec tellus sed augue semper porta。 Mauris massa。 Vestibulum lacinia arcu eget 法无。 )%!g(string = Matt Ridley) %!g(string = test,so-cool){%!g(int64 = 63570890170)%!g(int32 = 842211000) %!g(* time.Location =&amp; {UTC [] [] 0 0})}}
密钥记录为...
2015/06/29 03:04:08 INFO:Key:0
身体转储:
2015/06/29 14:00:34信息:正文:{“Key”:“5593215650496512”,“标题”:“示例第8条”,“文字”:“Lorem ipsum dolor sit amet,consectetur adipiscing elit整数nec odio.Praesent libero.Sed cursus ante dapibus diam.Sed nisi.Nulla quis sem at nibh elementum imperdiet.Duis sagittis ipsum.Praesent mauris.Fusce nec tellus sed augue semper porta.Mauris massa.Vestibulum lacinia arcu eget nulla。“ ,“作者”:“马特雷德利”,“标签”:“测试,如此酷”,“发表”:“2015-06-29T13:28:06.168062Z”}
我几天来一直在敲打这个问题,所以任何见解都会受到赞赏。谢谢!
答案 0 :(得分:1)
当你解组你的文章时,你忽略了这个错误。您应该看到json: cannot unmarshal string into Go value of type int64
,因为正文中的Key
值被格式化为字符串。
如果它符合您的期望,那么您可以通过在标记中添加string
选项来告诉json包使用它:
type Article struct {
Key int64 `json:"Key,string" datastore:"-"`
Title string
Text string `datastore:",noindex"`
Author string
Tags string
Posted time.Time
}