使用JSON-SERVER返回JSON对象而不是JSON数组

时间:2016-03-01 11:26:35

标签: arrays json rxjs cyclejs

我使用json-server将json数据作为REST api推送。

服务器返回(上面)获取请求,如下所示:

http://localhost:3000/items?itemid=534

返回:

[
  {
    "itemid": 534,
    "type": "textcontent",
    "icon": "http://exampple.com/1png",
    "title": "John",
    "description": "Description",
    "url": "http://example.net/project/doSomething"
  }
]

返回JSON array,但不是JSON object

我该怎么做才能返回json对象

数据文件是:data.json

{
  "items": [
    {
      "itemid": 534,
    "type": "textcontent",
    "icon": "http://exampple.com/1png",
    "title": "John",
    "description": "Description",
    "url": "http://example.net/project/doSomething"
    },
    {
      "itemid": 234,
    "type": "textcontent",
    "icon": "http://exampple.com/2png",
    "title": "Smith",
    "description": "Description2",
    "url": "http://example.net/project/doSomething2"
    }
    ]
}

3 个答案:

答案 0 :(得分:0)

如果您将数据更改为:

Function InStrC(ByVal SearchIn As String, ByVal SoughtCharacters As String) As Integer
'--- Returns the position of the first character in SearchIn that is contained
'--- in the string SoughtCharacters. Returns 0 if none found.
Dim i As Integer

On Error Resume Next
SoughtCharacters = UCase(SoughtCharacters)
SearchIn = UCase(SearchIn)
For i = 1 To Len(SearchIn)
If InStr(SoughtCharacters, Mid(SearchIn, i, 1)) > 0 Then
InStrC = i: Exit Function
End If
Next i
InStrC = 0
End Function

然后您可以使用以下网址访问各个项目: http://localhost:3000/items/534

答案 1 :(得分:0)

很简单。您需要做的就是在客户端上存储数据后对其进行映射。我已经使用了Rx.Observable.from方法,但这可以与其他方法一起使用,例如fromPromise。

const data = [{
    "itemid": 534,
    "type": "textcontent",
    "icon": "http://exampple.com/1png",
    "title": "John",
    "description": "Description",
    "url": "http://example.net/project/doSomething"
  }
];

const data$ = Rx.Observable.from(data)
  .map(arr=> {
     return JSON.stringify({
       "items": arr
     });
  });

 data$.subscribe(x=> console.log(x));
 // this will print out something like this
//{"items":{"itemid":534,"type":"textcontent","icon":"http://exampple.com/1png","title":"John","description":"Description","url":"http://example.net/project/doSomething"}}

另请注意,如果您在事后只需要一个对象,则可以返回{'items':arr}。

答案 2 :(得分:0)

我认为这是您正在使用的URL方案所需的行为。如果您使用标识单个资源的URL,则服务器应仅返回单个对象。

当您使用查询参数时,您的请求会显示"请返回item_id为534"的所有匹配项。这意味着json-server当然会返回一个项目数组。没有特别的知识,这个itemid是一个独特的。如果要指定一个特殊项目,则应使用特定项目的URL,该URL应该看起来像http://localhost:3000/items/534

这篇文章解释了很好的概念:http://www.vinaysahni.com/best-practices-for-a-pragmatic-restful-api

<强>更新

我的问题出错了。您希望将所有结果数据包含在一个特殊键下,而不是直接包含在数组值下。查看json-server的文档,似乎很容易扩展现有行为。 router.render()功能可以帮助您实现目标吗? https://github.com/typicode/json-server#module

router.render = function (req, res) {
  res.jsonp({
    yourkey: res.locals.data
  })
}

如果您希望密钥与您要查询的资源类型相匹配,则可能需要查看req对象以找出请求的实体类型。