简体   繁体   English

使用ObjectMapper Java API解析JSON字符串

[英]Parse JSON String using ObjectMapper java API

I have a JSON as below. 我有一个JSON,如下所示。 The goal is to get the corresponding "ip","PRODUCTTYPE" and "ID" values. 目的是获得相应的“ ip”,“ PRODUCTTYPE”和“ ID”值。

{
    "customerId": "dummy1",
    "nameIdmap": {
        "10.2.1.0": "{PRODUCTTYPE=null, ID=123}",
        "10.2.1.3": "{PRODUCTTYPE=null, ID=456}",
        "10.2.1.4": "{PRODUCTTYPE=null, ID=789}",
        "10.2.1.5": "{PRODUCTTYPE=null, ID=193}"
    }
}

I am using the ObjectMapper API to parse and fetch the values. 我正在使用ObjectMapper API解析和获取值。

ObjectMapper om = new ObjectMapper();
JsonNode node = om.readTree(stringToBeParsed);
String customerID = node.get("customerId").asText();
System.out.println("The Customer ID is ::: "+customerID);
JsonNode nameIdmap = node.get("nameIdmap");
StreamSupport.stream(nameIdmap.spliterator(), false).forEach(
        kv -> {
          System.out.println(kv.asText().split(",")[0] +" , 
          "+kv.asText().split(",")[1]);
});

But the issue is I, am unable to get the key which is the ip-address in this case. 但是问题是我,在这种情况下无法获取密钥,即IP地址。 Tried different ways to achieve but could not get what i want. 尝试了不同的方法来实现,但无法获得我想要的。

I checked if the nameIdmap is an array nameIdmap.isArray() but it is false . 我检查了nameIdmap是否为数组nameIdmap.isArray()但它为false

I also tried below but could not get the ip ie the key 我也在下面尝试,但无法获取IP即密钥

JsonNode nameIdmap = node.get("nameIdmap"); 
StreamSupport.stream(nameIdmap.spliterator(), false).collect(Collectors.toList())
  .forEach(item -> {
            System.out.println(item.asText());
   });;

You can get the field names by nameIdmap.getFieldNames as an iterator. 您可以通过nameIdmap.getFieldNames作为迭代器来获取字段名称。 You can then iterate over like that: 然后,您可以像这样迭代:

...
Iterator<String> fieldNames = idmap.getFieldNames();
while(fieldNames.hasNext()) {
  String ip = fieldNames.next();
  String textValue = idmap.get(ip).getTextValue()
  System.out.println(ip + ":" + textValue);
}

If the nested information is also JSON you can then access it further via idmap.get(ip).get("ID"); 如果嵌套信息也是JSON,则可以通过idmap.get(ip).get(“ ID”);进一步访问它。 if not then you still have the option to find it by regex like that: 如果没有,那么您仍然可以选择通过正则表达式来查找它,如下所示:

Pattern p = Pattern.compile("ID=(\\d+)");
Matcher m = p.matcher(textValue);
if(m.find()) {
  System.out.println(ip + ":" + m.group(1));
}

You can try Custom Deserializer as below 您可以尝试按以下方式自定义反序列化器

1. Create Item class This is a POJO which stands for an ID and a map of String and IPItem 1.创建Item类 这是一个POJO,代表一个ID以及String和IPItem的映射

public class SOItem {
    @Override
    public String toString() {
        return "SOItem [id=" + id + ", map=" + map + "]";
    }
    String id;
    Map<String, SOIPItem> map = new HashMap();

    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    public Map<String, SOIPItem> getMap() {
        return map;
    }
    public void setMap(Map<String, SOIPItem> map) {
        this.map = map;
    }
}

2. Create IPItem class This is a POJO for an ID and ProductType 2.创建IPItem类 这是ID和ProductType的POJO

public class SOIPItem {
    private String type;
    private String id;

    public String getType() {
        return type;
    }
    public void setType(String type) {
        this.type = type;
    }
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }

    @Override
    public String toString() {
        return "SOIPItem [type=" + type + ", id=" + id + "]";
    }
    public SOIPItem(String type, String id) {
        super();
        this.type = type;
        this.id = id;
    }
}

3. Create a Custom Deserializer 3.创建一个自定义反序列化器

import java.io.IOException;
import java.util.Iterator;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.ObjectCodec;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.deser.std.StdDeserializer;

public class SOCustDeser extends StdDeserializer<SOItem> {

    public SOCustDeser() {
        this(null);
    }
    public SOCustDeser(Class<?> vc) {
        super(vc);
    }

    /**
     * 
     */
    private static final long serialVersionUID = -394222274225082713L;

    @Override
    public SOItem deserialize(JsonParser parser, DeserializationContext arg1)
            throws IOException, JsonProcessingException {
        SOItem soItem = new SOItem();

        ObjectCodec codec = parser.getCodec();
        JsonNode node = codec.readTree(parser);

        soItem.setId(node.get("customerId").asText());

        JsonNode idmap = node.get("nameIdmap");
        Iterator<String> fieldNames = idmap.fieldNames();
        while(fieldNames.hasNext()) {
          String ip = fieldNames.next();
          String textValue = idmap.get(ip).asText();

          Pattern p = Pattern.compile("(.*?)=(.*?),(.*?)(\\d+)");
          Matcher m = p.matcher(textValue);
          if (m.find()) {
              soItem.map.put(ip, new SOIPItem(m.group(2), m.group(4)));
          }
        }

        return soItem;
    }
}

4. Test class 4.考试班

import java.io.File;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.module.SimpleModule;

public class MicsTest {
    public static void main(String[] args) throws Exception {
        ObjectMapper om = new ObjectMapper();
        SimpleModule sm = new SimpleModule();
        sm.addDeserializer(SOItem.class, new SOCustDeser());
        om.registerModule(sm);

        SOItem item = om.readValue(new File("c:\\temp\\test.json"), SOItem.class);

        System.out.println(item);
    }
}

5. Output SOItem [id=dummy1, map={10.2.1.0=SOIPItem [type=null, id=123], 10.2.1.3=SOIPItem [type=null, id=456], 10.2.1.5=SOIPItem [type=null, id=193], 10.2.1.4=SOIPItem [type=null, id=789]}] 5.输出 SOItem [id = dummy1,map = {10.2.1.0 = SOIPItem [type = null,id = 123],10.2.1.3 = SOIPItem [type = null,id = 456],10.2.1.5 = SOIPItem [type = null,id = 193],10.2.1.4 = SOIPItem [type = null,id = 789]}]

Best way to handle these scenarios is to create a matching pojo for your json. 处理这些情况的最佳方法是为您的json创建匹配的pojo。 This way it gives you flexibility to play around with the data. 这样,您可以灵活地处理数据。

Create classes like these 创建像这样的类

public class Someclass {

    private String customerId;

    Map<String, String> nameIdmap;

    public Map<String, String> getNameIdmap() {
        return nameIdmap;
    }

    public void setNameIdmap(Map<String, String> nameIdmap) {
        this.nameIdmap = nameIdmap;
    }

    public Someclass() {
    }

    public String getCustomerId() {
        return customerId;
    }

    public void setCustomerId(String customerId) {
        this.customerId = customerId;
    }
}

And this code will translate your json to SomeClass class 这段代码会将您的json转换为SomeClass类

String json = "<copy paste your json here>";
Someclass someclass = objectMapper.readValue(json, Someclass.class);
String s = someclass.getNameIdmap().get("10.2.1.0");
String[] splits = s.split(" ");
String productType = splits[0].split("=")[1];
String id = splits[1].split("=")[1];
System.out.println(productType + "  " + id);

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM