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

向restendpoint发送json数组会导致jackson解析异常

蒋斯伯
2023-03-14

我的旧书堆

  • spring boot 1.5.6 realease

我的目标

我试图将一些数据打印到jasper report中,所以我创建了一个rest控制器,我想从前端发送json数据,并通过jackson api将其解析到pojo列表中,然后使用JRDataBean来处理我的报告

我的密码

当按下打印按钮时,我正在使用ajax发送这个json数组,我从chrome控制台获得了这个json数组,将其设置为一个全局变量,然后使用一个副本(我在谷歌上搜索以获取字符串形式的变量内容)

  • 这是我的json

.

   [ {
    "codeInterne": 45,
    "clientName": "TalcorpDZ",
    "clientPhone": "+213778217469",
    "codeExterne": "CLI201801",
    "email": "talcorpdz@gmail.com",
    "clientType": 0,
    "clientEtat": 1,
    "identifiant": "TalcorpDZ",
    "contacts": [
      {
        "nom": "Taleb",
        "prenom": "Mohammed Housseyn",
        "telephonePortable": "04330256699",
        "email": null
      }
    ],
    "adresses": [
      {
        "adress": "Batiments des enseignants Mohammed Khemisti",
        "ville": "Maghnia"
      }
    ]
  },
  {
    "codeInterne": 64,
    "clientName": "lkjhgf",
    "clientPhone": "+213778217469",
    "codeExterne": "dfghjk",
    "email": "talcorpdz@gmail.com",
    "clientType": 1,
    "clientEtat": 1,
    "identifiant": "lkjhgf",
    "contacts": [
      {
        "nom": "Taleb",
        "prenom": "Mohammed",
        "telephonePortable": "02354649",
        "email": "talcorpdz@gmail.com"
      }
    ],
    "adresses": [
      {
        "adress": "Batiments des enseignants Mohammed Khemist",
        "ville": "Maghnia"
      }
    ]
  }
]
  • 这是我做post请求的部分

.

$(document).on('click', '#menu0-func1-menu0-func1', function(){
        console.log(printData);
            var settings = {
                "async" : true,
                "crossDomain" : true,
                "url" : "http://"+document.location.host+"/facturation/print/client",
                "method" : "POST",
                "headers" : {
                    "cache-control" : "no-cache",
                    'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
                },
                "processData" : false,
                "contentType" : "application/json",
                "dataType" : "json",
                "data" : printData
            }

            $.ajax(settings).done(function(response) {
                console.log(response);

            });
    });

我的管理员对这篇文章很满意,其编码如下:

@RestController
@RequestMapping(PrintController.API)
public class PrintController {
    public static final String API="print";


    @PostMapping("client")
    public void export(@RequestBody List<ClientJsonDto> datas,HttpServletResponse response){

        System.out.println(datas);

        // processing the print mechanisme

    }
}

最后是我的客户桑多。JAVA

@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonPropertyOrder({
    "codeInterne",
    "clientName",
    "clientPhone",
    "codeExterne",
    "email",
    "clientType",
    "clientEtat",
    "identifiant",
    "contacts",
    "adresses"
})
public class ClientJsonDto {

    @JsonProperty("codeInterne")
    private Integer codeInterne;
    @JsonProperty("clientName")
    private String clientName;
    @JsonProperty("clientPhone")
    private String clientPhone;
    @JsonProperty("codeExterne")
    private String codeExterne;
    @JsonProperty("email")
    private String email;
    @JsonProperty("clientType")
    private Integer clientType;
    @JsonProperty("clientEtat")
    private Integer clientEtat;
    @JsonProperty("identifiant")
    private String identifiant;
    @JsonProperty("contacts")
    private List<Contact> contacts = null;
    @JsonProperty("adresses")
    private List<Adress> adresses = null;
    @JsonIgnore
    private Map<String, Object> additionalProperties = new HashMap<String, Object>();

// getters, setters 
}

地址。JAVA

@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonPropertyOrder({
    "adress",
    "ville"
})
public class Adress {

    @JsonProperty("adress")
    private String adress;
    @JsonProperty("ville")
    private String ville;
    @JsonIgnore
    private Map<String, Object> additionalProperties = new HashMap<String, Object>();

//getters, setters
}

联系JAVA

@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonPropertyOrder({
    "nom",
    "prenom",
    "telephonePortable",
    "email"
})
public class Contact {

    @JsonProperty("nom")
    private String nom;
    @JsonProperty("prenom")
    private String prenom;
    @JsonProperty("telephonePortable")
    private String telephonePortable;
    @JsonProperty("email")
    private String email;
    @JsonIgnore
    private Map<String, Object> additionalProperties = new HashMap<String, Object>();
 //getters setters
}

我面临的例外是:

2018-11-18 15:12:40.255警告1768---[nio-8082-exec-9]。w、 s.m.s.DefaultHandlerExceptionResolver:无法读取HTTP消息:org。springframework。http。转换器。HttpMessageEndableException:JSON解析错误:无法识别的标记“对象”:应为('true'、'false'或'null');嵌套的异常是com。fasterxml。杰克逊。果心JsonParseException:无法识别的标记“object”:在[Source:java.io]处应为('true'、'false'或'null')。PushbackInputStream@1df244f9; 第1行第9列]

在jackson尝试列表之前,我能做些什么来查看我的Rest控制器作为请求体接收到什么?

我可以做些什么来修复此异常?

共有3个答案

庞书
2023-03-14

终于修好了

我的修正基于本教程,我提到的是我正在以一种阴暗的方式处理我的数组,所以我尝试了同样的原理,并添加了JSON。stringify并将数据类型更改为text

这是我做的所有改变

$(document).on('click', '#menu0-func1-menu0-func1', function(){
    console.log(printData);
    var jsonData =JSON.parse(JSON.stringify(printData));
        var settings = {
            "async" : true,
            "crossDomain" : true,
            "url" : "http://"+document.location.host+"/facturation/print/client",
            "method" : "POST",
            "headers" : {
                "cache-control" : "no-cache",
                'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
            },
            "processData" : false,
            "contentType" : "application/json",
            "dataType" : "text",
            "data" : JSON.stringify(printData)
        }

        $.ajax(settings).done(function(response) {
            console.log(response);

        });
});

我正在打印的打印数据处理如下

var printData =[];

function displayList(){
    console.log("click");
    if(console.log($('#search-client').val())){
        console.log($('#search-client').val().toLowerCase());
    }
    var as=clientsData.filter((n,i,a) =>{return (
            n.email.toLowerCase().indexOf($('#search-client').val().toLowerCase()) >= 0 || 
            n.contacts[0].nom.toLowerCase().indexOf($('#search-client').val().toLowerCase()) >= 0 ||
            n.contacts[0].prenom.toLowerCase().indexOf($('#search-client').val().toLowerCase()) >= 0 || 
            n.adresses[0].ville.toLowerCase().indexOf($('#search-client').val().toLowerCase()) >= 0 || 
            n.contacts[0].telephonePortable.toLowerCase().indexOf($('#search-client').val().toLowerCase()) >= 0)});
    var html=' ';
    console.log(as.length);
    printData = [];
    for(var i=0; i<as.length ; i++){
        var ClientJsonDto = as[i];
        html+=[{client : as[i] , index : i}].map(RefCliElement).join('');   
        printData.push(ClientJsonDto);
    }

    console.log(JSON.stringify(printData));
    $('#clientList').html(html);
    console.log(html);

}

在修复之前,它是这样的,可能这个想法是为了避免,因为我使用的是一个不知道的jquery对象数组

var printData;

function displayList(){
    console.log("click");
    if(console.log($('#search-client').val())){
        console.log($('#search-client').val().toLowerCase());
    }
    var as=clientsData.filter((n,i,a) =>{return (
            n.email.toLowerCase().indexOf($('#search-client').val().toLowerCase()) >= 0 || 
            n.contacts[0].nom.toLowerCase().indexOf($('#search-client').val().toLowerCase()) >= 0 ||
            n.contacts[0].prenom.toLowerCase().indexOf($('#search-client').val().toLowerCase()) >= 0 || 
            n.adresses[0].ville.toLowerCase().indexOf($('#search-client').val().toLowerCase()) >= 0 || 
            n.contacts[0].telephonePortable.toLowerCase().indexOf($('#search-client').val().toLowerCase()) >= 0)});
    var html=' ';
    console.log(as.length);
    for(var i=0; i<as.length ; i++){
        html+=[{client : as[i] , index : i}].map(RefCliElement).join('');   
    }
    printData = as;
    $('#clientList').html(html);
    console.log(html);

}

希望这能在未来帮助像我这样的入门级

华阳秋
2023-03-14

我相信您希望看到接收到的内容,这样您就可以找到它没有映射到DTO的原因。

试着改变

@RequestBody List<ClientJsonDto> datas

@RequestBody List<Map> datas

@RequestBody List datas

看看你能否打印并调试它。

杨昆
2023-03-14

您的json值和映射都是正确的,但我无法看到producer和consumer发出映射后请求,因为您必须明确定义producer和consumer。

错误可能是由于您提供给控制器的数据格式造成的。控制器方法需要JSON字符串。例如,对于jQuery,JSON。stringify()提供JSON字符串。所以我建议你在客户端确认这一点,从那里你将数据发送到这个控制器。

您需要更改和检查的代码

@RestController
@RequestMapping(PrintController.API)
public class PrintController {
    public static final String API="print";

@PostMapping("client",produces=MediaType.APPLICATION_JSON_VALUE,consumes=MediaType.APPLICATION_JSON_VALUE)
        public void export(@RequestBody List<ClientJsonDto> datas,HttpServletResponse response){

            System.out.println(datas);

            // processing the print mechanisme

        }
    }
 类似资料:
  • com.fasterxml.jackson.databind.jsonMappingException:属性“wallpaper”的setter定义冲突:在RializerCache._CreateAndCache2(deserializerCache.java:298)...com.fasterxml.jackson.databind.objectMapper._ReadMapandClose(

  • 我正在解析下面的json,但无法正确理解。它说用户START_ARRAY令牌。 我正在用这个代码映射它: 我的响应类如下所示: 我的User类看起来像这样:

  • 那么,我的问题是,有没有一种方法,我可以异步读取我的JSON文件块,不超过256MB的缓冲区长度,而不手动传播我的JSON数据到几个文件?

  • 我试图解组xml导致saxparser异常,因为元素的值有一个未正确关闭的标记元素。这是我得到的,我必须处理的。 这里是示例xml- 上面的xml和其他字符串一起作为命令的值,标签没有正确关闭,导致以下异常- [org.xml.sax.saxpasseeption;行号:1;列号:212;元素类型“ctag”后面必须跟有属性规范,” 将xml输入作为字符串阅读器提供给unMarshall 我有两个

  • 我已经编写了糟糕的代码来解析上面的json数组。下面是我使用的代码, 有谁能帮助我知道使用Jackson解析JSON吗?我们非常感谢你的帮助。

  • 我正在将Jackson从1.9.4升级到2.2.0。过渡非常顺利,只是我似乎无法对对象进行数组解析。在1.9.4中,我可以这样做: 在Jackson 2.2.0中,我得到了一个“无法解析方法”编译时错误。Jackson 1.9.4的ObjectMapper头文件包含以下JsonNodes的readValue方法: 和Jackson 2.2.0的头文件: 所以我需要从传递JsonNode切换到Jso