【问题标题】:can Rest API parse hashmap<string,object>?Rest API 可以解析 hashmap<string,object> 吗?
【发布时间】:2017-06-14 08:18:51
【问题描述】:

我想知道rest api在使用输入参数时是否可以执行以下操作:

假设我的 json 对象具有以下参数:

string name;

string adress;

hashmap<string,object> content;

以下是可以发送的示例:

{
    "name": "AZ",
    "adress": "US",
    "content": {
        "clients": [
            {
                "client_ref":"213",
                "commands" : {
                    "subCommands": [
                        {
                            "num":"1",
                            "price":"10euro"
                        },
                        {
                            "num":"12,
                            "price":"10euro"
                        }
                    ]
                }
            },
            {
                "client_ref":"213",
                "commands" : {
                    "subCommands": [
                        {
                            "num":"1",
                            "price":"10euro"
                        },
                        {
                            "num":"12,
                            "price":"10euro"
                        }
                    ]
                }
            }
        ]
    }
}

问题是可以在对象本身可以有n个hashmap类型的子节点的地方构建hashmap吗?

(我使用球衣作为休息实现)

【问题讨论】:

  • 你试过了吗?发生了什么?如果出现问题,请向我们展示代码并描述问题所在和位置。

标签: java json rest jersey


【解决方案1】:

假设您注册了一个 JSON 提供程序,例如 Jackson,并且您的模型类如下所示:

public class Foo {

    private String name;
    private String address;
    private Map<String, Object> content;

    // Getters and setters
}

以下资源方法:

@Path("foo")
public class Test {

    @POST
    @Consumes(MediaType.APPLICATION_JSON)
    public Response post(Foo foo) {
        ...
    }
}

可以处理如下请求:

POST /api/foo HTTP/1.1
Host: example.org
Content-Type: application/json

{
  "name": "AZ",
  "adress": "US",
  "content": {
    "clients": [
      {
        "client_ref": "213",
        "commands": {
          "subCommands": [...]
        }
      },
      {
        "client_ref": "213",
        "commands": {
          "subCommands": [...]
        }
      }
    ]
  }
}

【讨论】:

    【解决方案2】:

    content 是一个对象,而不是地图。

    "content": {
        "clients": [
            {
                "client_ref":"213",
                "commands" : {
                    "subCommands": [
                        {
                            "num":"1",
                            "price":"10euro"
                        },
                        {
                            "num":"12,
                            "price":"10euro"
                        }
                    ]
                }
            },
            {
                "client_ref":"213",
                "commands" : {
                    "subCommands": [
                        {
                            "num":"1",
                            "price":"10euro"
                        },
                        {
                            "num":"12,
                            "price":"10euro"
                        }
                    ]
                }
            }
        ]
    }
    

    这是 Java 对象表示。

    public class Content {
    
        private List<Client> clients;
    
        //Getters and setters
    }
    
    
    public class Client {
    
        private String clientRef;
        private List<Command> commands;
    
        //Getters and setters
    }
    //And so on, define other classes.
    

    回答您的问题,是的,您可以构建地图。 请检查这个例子。它告诉如何解析未知的 json(以防您不知道 json 对象的确切结构)。 https://stackoverflow.com/a/44331104/4587961

    然后你可以用字段构建地图 Map&lt;String, Object&gt; 其中该地图的某些值将是嵌套地图。

    【讨论】:

    • 谢谢Yan,我的例子误导了你们俩,我有一个REST API,它将接受具有hashmap 内容属性的客户端JSON对象,我的问题是REST api能够自动将已发送到我的服务的任何复杂结构转换为其相应的哈希图结构吗? (这意味着我们可以处理嵌套的 hashmap)
    【解决方案3】:

    您可以使用 javax.ws.rs.core.GenericEntity 用泛型类型(您的 HashMap)包装集合。

    @GET
    @Path("/mapping")
    @Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON })
    public Response getAllMapContents() {
    
        Map<String,Object> map = new HashMap<String,Object>();
    
        map.put("Hello", "World");
        map.put("employee", new Employee(1,"nomad"));
    
        GenericEntity<Map<String,Object>> entity = new GenericEntity<Map<String,Object>>(map) {};
        return Response.ok(entity).build();
    }
    

    我检查了它并发现它工作请在下面找到回复。谢谢。

    {
       "Hello": "World",
       "employee": {
          "id": 1,
          "name": "nomad"
       }
    }
    

    【讨论】:

    • 我的例子是另一种方式,一个接受客户端 json 对象的休息(POST,而不是 GET),它有一个对象的内容哈希图,知道我不知道的结构将要发送的内容,我们最终可以得到具有 N 级嵌套哈希图的对象的哈希图...... REST api 能够处理这个吗?将接收到的内容JSON复杂结构转换为可以有N级嵌套hashmap的对象..
    猜你喜欢
    • 2018-08-11
    • 2021-11-13
    • 2020-03-13
    • 2014-07-20
    • 1970-01-01
    • 1970-01-01
    • 2018-07-16
    • 2016-07-23
    • 2020-02-26
    相关资源
    最近更新 更多