Java 如何从无法转换为Json的字符串中提取值

Java 如何从无法转换为Json的字符串中提取值,java,json,string,Java,Json,String,在处理DialogFlow响应对象时,我得到以下给定字符串作为textPayload。如果这是一个Json字符串,我可以轻松地将其转换为JSONObject,然后提取值。但是,无法将其转换为Json对象。如何获取此字符串中键的值?在Java中解析此字符串的好方法是什么 要处理的字符串 像这样为TextPayload对象创建一个类 public class TextPayload { private int session_id; private String lang; pri

在处理DialogFlow响应对象时,我得到以下给定字符串作为textPayload。如果这是一个Json字符串,我可以轻松地将其转换为JSONObject,然后提取值。但是,无法将其转换为Json对象。如何获取此字符串中键的值?在Java中解析此字符串的好方法是什么

要处理的字符串


像这样为TextPayload对象创建一个类

public class TextPayload {
   private int session_id;
   private String lang;
   private String timestamp;
   private String[] metadata ;
   //Other attributes
   //getters setters
}
然后使用
ObjectMapper
从textpayload中提取如下值:

    ObjectMapper mapper = new ObjectMapper();
    TextPayload textPayload = mapper.readValue(output, User.class);

要使用
ObjectMapper
并实际操作它,请按照下面的方法为TextPayload对象创建一个类

public class TextPayload {
   private int session_id;
   private String lang;
   private String timestamp;
   private String[] metadata ;
   //Other attributes
   //getters setters
}
然后使用
ObjectMapper
从textpayload中提取如下值:

    ObjectMapper mapper = new ObjectMapper();
    TextPayload textPayload = mapper.readValue(output, User.class);

要使用
ObjectMapper
并使用它,请遵循如果我理解正确,这里的问题是键没有引号标记,因此JSON解析器将拒绝此操作

由于所有键都从一个新行开始,带有一些空格,并且都以冒号结束:您可以使用正则表达式轻松地解决这个问题

然后,您可以通过

Map<String, Object> map 
  = objectMapper.readValue(json, new TypeReference<Map<String,Object>>(){});
地图
=objectMapper.readValue(json,新类型引用(){});

(但我假设您知道这一点)。

如果我理解正确,这里的问题是键没有引号,因此JSON解析器将拒绝此项

由于所有键都从一个新行开始,带有一些空格,并且都以冒号结束:您可以使用正则表达式轻松地解决这个问题

然后,您可以通过

Map<String, Object> map 
  = objectMapper.readValue(json, new TypeReference<Map<String,Object>>(){});
地图
=objectMapper.readValue(json,新类型引用(){});

(但我假设您知道这一点)。

将其转换为有效的json,然后使用许多库中的一个进行映射

您只需要:

  • 将对话框流响应:替换为
    {
  • 在末尾添加
    }
  • 在属性之间添加逗号,即
    • 在每行末尾加一个“
      ”:“
    • “}”
      之后,除非下一个非空白也是
      “}”
Jackson(至少)可以配置为允许在属性名称周围加引号,这是可选的


反序列化到
映射
适用于所有有效的json(数组除外,它不是)。

将其转换为有效的json,然后使用许多库中的一个进行映射

您只需要:

  • 将对话框流响应:替换为
    {
  • 在末尾添加
    }
  • 在属性之间添加逗号,即
    • 在每行末尾加一个“
      ”:“
    • “}”
      之后,除非下一个非空白也是
      “}”
Jackson(至少)可以配置为允许在属性名称周围加引号,这是可选的


反序列化到
映射
适用于所有有效的json(数组除外,它不是)。

不起作用。它离有效的json太远了,无法映射为yes。我明白。但问题是,这既不是Json,也不是Json字符串。这只是一个正确对齐的字符串。如何使用ObjectMapper处理此问题?不起作用。它离有效的json太远了,无法映射为yes。我明白。但问题是,这既不是Json,也不是Json字符串。这只是一个正确对齐的字符串。如何使用ObjectMapper处理此问题?是的。这正是问题所在。需要写一个正则表达式。但是这里的正则表达式比较简单。是的。这正是问题所在。需要编写正则表达式。但是这里的正则表达式比较简单。是的。需要为所有这些编写正则表达式。@Kabilesh第一个不需要正则表达式,或者第二个-只需要
+“}
。第三个
replaceAll((?m^.*:.*),“$0”,”
最后一个
replaceAll(}\\s*([^\\s}]),“},$1”)
将节省大量时间。加上双引号@Chritian提到什么是正则表达式?什么双引号?你认为你在哪里需要它们?在Json中应该是“lang”:“en”而不是lang:“en”对吗??键和值的周围都应该有双引号。是的。需要为所有这些写正则表达式。@Kabilesh第一个不需要正则表达式,或者第二个-只要
+“}”
。第三个
replaceAll((?m^.*:.*),“$0”,”
最后一个
replaceAll(}\\s*([^\\s}]),“},$1”)
将节省大量时间。加上双引号@Chritian提到什么是正则表达式?什么双引号?你认为你在哪里需要它们?在Json中应该是“lang”:“en”而不是lang:“en”对吗??键和值的周围都应该有双引号。