【问题标题】:How to Remove keyname from json string如何从 json 字符串中删除键名
【发布时间】:2019-04-26 05:20:53
【问题描述】:

我有一个这样的 json 字符串。

[
            {
                "_source": {
                    "name": "Jam Brong",
                    "image": "https://asdf.asdf.com/asdf/image/upload/w_30,h_30,c_fill/product/fb7d3dcb505fba76262c0c6383d844ae.jpg",
                    "price": "2500",
                    "slug": "133-jam-brong",
                    "short_name": "Jam Brong"
                }
            },
            {
                "_source": {
                    "name": "Jam abcfdfjn",
                    "image": "https://asdf.asdf.com/asdf/image/upload/w_30,h_30,c_fill/product/7bbd3d081dd03c442e4cb27321a7b50c.jpg",
                    "price": "10888",
                    "slug": "87-jam-abcfdfjn",
                    "short_name": "Jam abcfdfjn"
                }
            }
]

我需要删除"_source":{

所以我可以得到一个这样的 json 字符串。

[
            {

                    "name": "Jam Brong",
                    "image": "https://asdf.asdf.com/asdf/image/upload/w_30,h_30,c_fill/product/fb7d3dcb505fba76262c0c6383d844ae.jpg",
                    "price": "2500",
                    "slug": "133-jam-brong",
                    "short_name": "Jam Brong"

            },
            {

                    "name": "Jam abcfdfjn",
                    "image": "https://asdf.asdf.com/asdf/image/upload/w_30,h_30,c_fill/product/7bbd3d081dd03c442e4cb27321a7b50c.jpg",
                    "price": "10888",
                    "slug": "87-jam-abcfdfjn",
                    "short_name": "Jam abcfdfjn"

            }
]

我尝试使用replaceAll("("_source:{"),""); 此代码将向我显示一些错误,例如 number expected

我不知道如何将regex 用于包含_{ 的字符串。

在我想使用replaceAll 之前,我尝试过这样的jackson

String responses ="";
        ObjectNode node = new ObjectMapper().readValue(response.toString(), ObjectNode.class);
        ProductList productListInstance = new ProductList();
        List<Product> productList = new ArrayList<>();

        try {
            if(node.get("hits").get("hits").isArray()){
                for (final JsonNode objNode : node.get("hits").get("hits")) {
                    Product products = new ObjectMapper().readValue(objNode.get("_source").toString(), Product.class);
                    productList.add(products);
                }
                productListInstance.setProductList(productList);
            }
            responses = productListInstance.toString();
        }
        catch (Exception ex){
            responses = productListInstance.toString();
        }
        return responses;

其实第一个json字符串是这样的:

{
    "hits": {
        "hits": [
            {
                "_source": {
                    "name": "Jam Brong",
                    "image": "https://asdf.asdf.com/asdf/image/upload/w_30,h_30,c_fill/product/fb7d3dcb505fba76262c0c6383d844ae.jpg",
                    "price": "2500",
                    "slug": "133-jam-brong",
                    "short_name": "Jam Brong"
                }
            },
            {
                "_source": {
                    "name": "Jam abcfdfjn",
                    "image": "https://asdf.sdf.com/asdf/image/upload/w_30,h_30,c_fill/product/7bbd3d081dd03c442e4cb27321a7b50c.jpg",
                    "price": "10888",
                    "slug": "87-jam-abcfdfjn",
                    "short_name": "Jam abcfdfjn"
                }
            }
        ]
    }
}

【问题讨论】:

  • 不要手动操作。使用Jackson
  • 反序列化,然后序列化为别的东西。
  • @Kartik 我试过了,但杰克逊的表现变慢了。
  • @Bobby 那你一定是做错了什么。数百万人和框架正在毫无问题地使用它。尝试在此处共享该代码。
  • @Kartik 查看我更新的问题

标签: java json string


【解决方案1】:

您可以使用 Jackson 来实现这一点。首先,定义一个代表您的数据模型的 bean。

public static class Source {
    private String name;
    private String image;
    private String price;
    private String slug;
    private String shortName;

    @JsonCreator
    public Source(@JsonProperty("_source") Map<String, Object> rawJson) {
      this.name = rawJson.get("name").toString();
      this.image = rawJson.get("image").toString();
      this.price = rawJson.get("price").toString();
      this.slug = rawJson.get("slug").toString();
      this.shortName = rawJson.get("short_name").toString();
    }

    public String getName() {
      return name;
    }

    public void setName(String name) {
      this.name = name;
    }

    public String getImage() {
      return image;
    }

    public void setImage(String image) {
      this.image = image;
    }

    public String getPrice() {
      return price;
    }

    public void setPrice(String price) {
      this.price = price;
    }

    public String getSlug() {
      return slug;
    }

    public void setSlug(String slug) {
      this.slug = slug;
    }

    public String getShortName() {
      return shortName;
    }

    public void setShortName(String shortName) {
      this.shortName = shortName;
    }
  }

观察构造函数上的@JsonCreator注解。然后编写序列化和反序列化的代码:

    final ObjectMapper mapper = new ObjectMapper();
    Source[] sources = mapper.readValue(jsonStr, Source[].class);
    String converted = mapper.writeValueAsString(sources);
    System.out.println(converted);

打印:

[
  {
    "name": "Jam Brong",
    "image": "https://asdf.asdf.com/asdf/image/upload/w_30,h_30,c_fill/product/fb7d3dcb505fba76262c0c6383d844ae.jpg",
    "price": "2500",
    "slug": "133-jam-brong",
    "shortName": "Jam Brong"
  },
  {
    "name": "Jam abcfdfjn",
    "image": "https://asdf.asdf.com/asdf/image/upload/w_30,h_30,c_fill/product/7bbd3d081dd03c442e4cb27321a7b50c.jpg",
    "price": "10888",
    "slug": "87-jam-abcfdfjn",
    "shortName": "Jam abcfdfjn"
  }
]

【讨论】:

  • 你的代码运行良好,但我遇到了一些问题,如果某个字段为空怎么办?例如"name": null, "image": "https:...."
  • 在构造函数中,在为每个属性调用toStringchuck for null之前;例如:rawJson.get("name") == null ? null ? rawJson.get("name").toString()
  • 我将您的代码从 `Map` 更改为 `Map`
  • 这可能是您遇到问题的地方:使用Map&lt;String, Object&gt; 并将其显式转换为您需要的数据类型。这将有助于特别。如果你有一个不是字符串的字段。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-15
  • 2020-03-01
  • 1970-01-01
相关资源
最近更新 更多