org.codehaus.jackson.JsonParseException:意外字符('/'(代码47))

oyxsuwqo  于 2023-03-04  发布在  其他
关注(0)|答案(6)|浏览(160)

我有一个包含Json格式的HashMap客户列表的文件。
就像这样:

{"Davide":{"name":"Davide","cf":"FRCDVD","pi":"1234",
    "telephone":"333","website":"www","sector":"Student","address":"Rome"}}

这只是列表的一个客户。每次调用控制器时,我都想从文件中获取数据并将其转换为HashMap列表。
我试着这样做:

HashMap<String, Customer> listCustomer = new HashMap<>();
listCustomer = new ObjectMapper().readValue(pathCustomerFile, HashMap.class); //This line gives me error

我得到这个错误:
org.codehaus.jackson.JsonParseException:意外字符('/'(代码47)):可能是(非标准)注解?(由于未为解析器启用特性"ALLOW_COMMENTS",因此未识别为注解)
我该怎么做呢?

xesrikrc

xesrikrc1#

我最近遇到了这个问题。我试图传递一个路径(以字符串的形式)给readValue。你需要传递一个字符串来解析,或者一个文件对象。根据你的变量name,我想你可能传递了一个文件的路径。
(基本上,它阅读文件路径中的“/”并在其上抛出错误。

cgfeq70w

cgfeq70w2#

请仔细检查您输入的JSON字符串,确保没有错误转义或在某处悬挂/。例如/\"name\"。然后按以下方式提供正确的类型Map:

new ObjectMapper().readValue(pathCustomerFile, new TypeReference<HashMap<String, Customer>>(){});

我的答案在jackson-mapper-asl1.9.13中进行了测试。

**您只使用HashMap.class进行Map不会给予您想要的结果,因为Jackson会将您的JSONMap到Map<String, Map>。当您尝试从Map中获取值并将其当作Customer类型进行操作时,您会发现这一点。

ni65a41a

ni65a41a3#

我将为客户创建一个POJO,它包含客户和getter/setter对的列表,如下所示:

class CustomersFile{
  List<Customer> customers;

  //getter and setter
}

然后,我将使用字段名称和customerDetails创建类Customer,如下所示:

class Customer {
  String name;
  CustomerDetails details;

  //getters and setters for both fields
}

最后,我将创建包含所有字段的类CustomerDetails,如下所示:

class CustomerDetails {
  String name;
  String telephone;
  int pi; // and so on

  //getters and setters for all fields  
}

然后使用对象Map器将json中的所有客户Map到CustomersFile对象:

ObjectMapper mapper = new ObjectMapper();
//this configuration is needed in case you have only one customer in your json.
objectMapper.configure(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY, true);
CustomersFile customersFile = mapper.readValue(pathCustomerFile, CustomersFile.class);

要访问客户列表,请拨打:

List<Customer> customers = customersFile.getCustomers();

如果你真的需要一个HashMap,那么循环遍历列表并填充这个哈希Map:

HashMap<String, Customer> map = new HashMap<>();
for(Customer customer : customers) {
  // as string you can use the id of the customer (pi) but its no necessary, just use your desired String
  map.put("String.valueOf(customer.getPi())", customer);
}
    • 更新**

下面是我在项目pom中使用的依赖项:

<dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-annotations</artifactId>
        <version>2.4.1</version>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-core</artifactId>
        <version>2.4.1</version>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.4.1</version>
    </dependency>
brvekthn

brvekthn4#

我遇到了同样的问题。我错误地在请求负载中发送了类似“//”的评论。删除“//”对我很有效。

bzzcjhmw

bzzcjhmw5#

我在JSON中添加注解时遇到了同样的错误。我在https://github.com/elastic/elasticsearch/issues/1394上找到了解决方案

final ObjectMapper mapper = new ObjectMapper();
mapper.configure(JsonParser.Feature.ALLOW_COMMENTS, true);
final HashMap<String, Customer> listCustomer = mapper.readValue(pathCustomerFile, HashMap.class); //This line gives me no error
sgtfey8w

sgtfey8w6#

就我而言,这正是@Sergey K在最早的评论中指出的。所以功劳归于他。

String pathCustomerFile = "/blah/blah.json";  // <-- Problematic line
listCustomer = new ObjectMapper().readValue(pathCustomerFile, HashMap.class);

原来pathCustomerFileString,Jackson运行时试图将该字符串的值解释为JSON对象,因此出现了错误。

**意外字符'/'**是路径值"/blah/blah.json"的第一个字符

您还可以通过readValue方法抛出的checked异常来了解这一点,如果它是ProcessingException,那么参数本身很可能会被解释为JSON字符串。

解决方案:

使用File Package 路径字符串可解决此问题:

new ObjectMapper().readValue(new File(pathCustomerFile), HashMap.class);

您也可以通过将抛出的检查异常更改为IOException来验证这一点。

相关问题