当前位置: 首页 > 知识库问答 >
问题:

需要建议如何在Java中构造和修改JSON-payload

寇夜洛
2023-03-14
{
  "request": {
    "jsonRequest": {
      "Alpha": {
        "Bravo": [
          {
            "Delta": "something"
          }
        ],
        "Desert": [
          {
            "id": 1,
            "name": "Lena",
            "age": "25",
            "city": "Florida",
            "street": "Florida Street"
          },
          {
            "id": 2,
            "name": "Moa",
            "age": "21",
            "city": "Mexico",
            "street": "Mexico Street"
          },
          {
            "id": 3,
            "name": "Nils",
            "age": "29",
            "city": "Tampas",
            "street": "Tampas Street"
          }
        ]
      }
    }
  }
}
public class myClass {

  /* The string I want to send - note the %s which is the sub-strings that I want to be able to modify */
  private String payload = "{\r\n\"request\":{\r\n\"jsonRequest\":{\r\n\"Alpha\":{\r\n\"Bravo\":[\r\n{\r\n\"Delta\":\"something\"\r\n}\r\n],\r\n\"Desert\":[\r\n{\r\n\"id\":1,\r\n\"name\":\"%s\",\r\n\"age\":\"25\",\r\n\"city\":\"Florida\",\r\n\"street\":\"%s\"\r\n},\r\n{\r\n\"id\":2,\r\n\"name\":\"Moa\",\r\n\"age\":\"21\",\r\n\"city\":\"Mexico\",\r\n\"street\":\"%s\"\r\n},\r\n{\r\n\"id\":3,\r\n\"name\":\"Nils\",\r\n\"age\":\"29\",\r\n\"city\":\"Tampas\",\r\n\"street\":\"TampasStreet\"\r\n}\r\n]\r\n}\r\n}\r\n}\r\n}"

 // Method to return this string
 public String getPayload() {return this.payload;}
}
String temp = new myClass().getPayload();
String payload = String.format(temp, "Lena", "Florida Street", "Mexico Street");  

共有1个答案

云承弼
2023-03-14

您可以使用GSONJackson库来使用更结构化的方式。创建POJO类,并用这些库的特定注释对其进行注释。POJO深度级别与您的设计有关。最简单的方法是创建一个映射 并用您想要的内容填充它,如下所示:

    ObjectMapper mapper = new ObjectMapper();
    mapper.enable(SerializationFeature.INDENT_OUTPUT);

    Map<String, Object> items = new LinkedHashMap<>();
    items.put("request", Map.of(
            "jsonRequest", Map.of(
                    "Alpha", Map.of(
                            "Bravo", List.of("Delta", "something"),
                            "Desert", List.of(
                                    Map.of("id", 1),
                                    Map.of("id", 2),
                                    Map.of("id", 3),
                                    Map.of("id", 4)
                            )
                    )
            )));

    System.out.println(mapper.writeValueAsString(items));

ObjectMapper将生成如下内容:

{
  "request" : {
    "jsonRequest" : {
      "Alpha" : {
        "Bravo" : [ "Delta", "something" ],
        "Desert" : [ {
          "id" : 1
        }, {
          "id" : 2
        }, {
          "id" : 3
        }, {
          "id" : 4
        } ]
      }
    }
  }
}

更严格的方法是用更多的细节来设计您的POJO。[jackson-object-mapper][1]用于实现这些目标。

static class Request {
    private Map<String, JsonRequest> items = new LinkedHashMap<>();

    @JsonAnyGetter
    public Map<String, JsonRequest> getItems() {
        return items;
    }

    public void addItem(String property, JsonRequest value) {
        items.put(property, value);
    }
}

static class JsonRequest {
    private Map<String, List<JsonRequestItem>> items = new LinkedHashMap<>();

    @JsonAnyGetter
    public Map<String, List<JsonRequestItem>> getItems() {
        return items;
    }

    public void addItem(String property, List<JsonRequestItem> value) {
        items.put(property, value);
    }
}

static class JsonRequestItem {
    private Map<String, Object> items = new LinkedHashMap<>();

    @JsonAnyGetter
    public Map<String, Object> getItems() {
        return items;
    }

    public void addItem(String property, Object value) {
        items.put(property, value);
    }
}
public static void main(String[] args) throws JsonProcessingException {
    ObjectMapper mapper = new ObjectMapper();
    mapper.enable(SerializationFeature.INDENT_OUTPUT);

    Request request = new Request();
    JsonRequest alpha = new JsonRequest();
    alpha.addItem("Bravo", List.of(
            new JsonRequestItem() {{
                addItem("Delta", "something");
            }}
    ));

    alpha.addItem("Desert", List.of(
            new JsonRequestItem() {{
                addItem("id", 1);
                addItem("name", "Lena");
                addItem("age", "25");
                addItem("city", "Florida");
                addItem("street", "Florida Street");
            }},
            new JsonRequestItem() {{
                addItem("id", 2);
                addItem("name", "Moa");
                addItem("age", "21");
                addItem("city", "Mexico");
                addItem("street", "Mexico Street");
            }},
            new JsonRequestItem() {{
                addItem("id", 3);
                addItem("name", "Nils");
                addItem("age", "29");
                addItem("city", "Tampas");
                addItem("street", "Tampas Street");
            }}
    ));

    request.addItem("Alpha", alpha);

    System.out.println(mapper.writeValueAsString(request));
}
{
  "Alpha" : {
    "Bravo" : [ {
      "Delta" : "something"
    } ],
    "Desert" : [ {
      "id" : 1,
      "name" : "Lena",
      "age" : "25",
      "city" : "Florida",
      "street" : "Florida Street"
    }, {
      "id" : 2,
      "name" : "Moa",
      "age" : "21",
      "city" : "Mexico",
      "street" : "Mexico Street"
    }, {
      "id" : 3,
      "name" : "Nils",
      "age" : "29",
      "city" : "Tampas",
      "street" : "Tampas Street"
    } ]
  }
}
 类似资料:
  • 下面列出一些 Discuz! 应用常见的代码并给出相关的修改建议。 变量作用域问题 文件 myaddon.inc.php,该文件加密: <?php if(! defined ('IN_DISCUZ')) { exit ('Access Denied'); } $data = C::t('#myaddon#mytable')->fetch_my_d

  • 问题内容: java.library.path属性似乎是只读的。例如,当您在以下构建文件上运行ant时 你得到 输出表明 java.library.path 尚未更改,但是 some.other.property 设置正确。 我想知道如何在构建文件中修改java.library.path。实际上,在ant命令行上指定java.library.path并不是一个简单的选择,因为那时还不知道库路径位置

  • 问题内容: 除了* 使用如下所示的反射检查 之外 ,是否有任何方法 要求 类具有默认(无参数)构造函数?(以下方法可以工作,但是很hacky,反射速度很慢) * 问题答案: 您可以为此构建一个注释处理器。注释处理器是在编译时运行的编译器插件。它们的错误显示为编译器错误,甚至可能停止构建。 这是一个示例代码(尽管我没有运行它): 如果引入注释(例如RequiresDefaultAnnotation)

  • 嘿,所以我为ExecutorService的java文档选择了这个例子。我想确认这个代码的流程,执行者。newFixedThreadPool将创建一个线程池(我猜)。所以serversocket将等待连接,一旦获得连接,就会启动一个线程,所以现在池大小减少1。一旦线程完成执行,池大小将再次增加1,不是吗?线程会放弃它使用的资源吗?

  • 所以,我一直在使用maven进行项目管理,对运行Gradle没有任何想法。这是Uber Java sdk,它使用Gradle进行构建。https://github.com/uber/rides-java-sdk 到目前为止,我一直通过在pom.xml文件中添加以下工件来使用SDK: 最后一个正式发布的版本是0.2.0。从那时起,就增加了获取乘车收据的支持,这可以在源代码中看到。我需要获取游乐设备收

  • 问题内容: 我需要在Java中更改JSON属性的值,我可以正确获取该值,但无法修改JSON。 这是下面的代码 做这个的最好方式是什么? 问题答案: 是不可变的,旨在进行解析操作。但是,可以将其转换为允许突变的(和): 对于数组,可以使用: