JSON分析错误 - 无法更新核心数据库值

时间:2014-08-18 14:36:46

标签: java json angularjs jax-rs

我在AngularJS上使用JAX-RS,但由于json解析错误,我遇到了绊脚石。

使用jsonlint我可以看到问题,但因为我无法更新导致问题纠正字符的基础数据库值(公司数据仓库)......我现在遇到麻烦,因为我无法返回任何数据完全进入应用程序,因为只有少数记录中包含不合规的字符。

处理这类问题的一般方法是什么?是否在setter的java端搜索和替换非ascii字符?

更新

Chrome出错:

SyntaxError: Unexpected token 
    at Object.parse (native)
    at ub (http://localhost:8080/misf-web/lib/angular/angular.min.js:13:122)
    at e.defaults.transformResponse (http://localhost:8080/misf-web/lib/angular/angular.min.js:98:83)
    at http://localhost:8080/misf-web/lib/angular/angular.min.js:97:347
    at Array.forEach (native)
    at n (http://localhost:8080/misf-web/lib/angular/angular.min.js:6:470)
    at Yb (http://localhost:8080/misf-web/lib/angular/angular.min.js:97:329)
    at c (http://localhost:8080/misf-web/lib/angular/angular.min.js:99:14)
    at i (http://localhost:8080/misf-web/lib/angular/angular.min.js:79:437)
    at http://localhost:8080/misf-web/lib/angular/angular.min.js:80:485 angular.min.js:63
(anonymous function)

示例JSON输出 - 只是一个导致我出问题的例子......它并不总是“变音符号”......

  

{       “approvedPriority”:“已批准”,       “疾病”:“原发性Sj grens综合症”,       “疾病地区”:“炎症”,       “projectType”:“NME”,       “疗法区”:“RI”   }

在数据库中,这种疾病表现为“原发性Sjögren综合征”

jsonlint报道:

  

第3行的解析错误:... ed“,”疾病“:”主要Sj grensS   ---------------------- ^期待'STRING','NUMBER','NULL','TRUE','FALSE','{','[ “

并非总是“变音符号”导致我出现问题,有时它似乎是一个不可打印的字符,而且由于看起来比正常情况稍微宽一些的连字符而导致一个奇怪的错误。

更新

据我所知,我通过JAX-RS请求UTF-8。

@GET
    @Path("/projects")
    @Produces(MediaType.APPLICATION_JSON + "; charset=UTF-8")
    public List<Project> getAllProjects() {
        logger.debug("GET: list all projects");
        return projectService.getAllProjects();
    }

我正在使用Eclipse在Windows上使用Tomcat 7进行开发。

1 个答案:

答案 0 :(得分:0)

似乎@PRODUCES并且添加charset = utf-8并不起作用。

最后,我创建了一个过滤器,在发送之前将响应头添加了charset = utf = 8,并通过应用程序配置类将其注册为泽西的提供者。

现在它正常工作,数据正在完美地返回。

为什么@PRODUCES不起作用是个谜。

包com.mycompany.misf.filters;

import javax.ws.rs.container.ContainerRequestContext;
import javax.ws.rs.container.ContainerResponseContext;
import javax.ws.rs.container.ContainerResponseFilter;
import javax.ws.rs.core.MediaType;


public class HeaderResponseFilter implements ContainerResponseFilter {

        public void filter(ContainerRequestContext request, ContainerResponseContext response) {
            MediaType type = response.getMediaType();
            if (type != null) {
                String contentType = type.toString();
                if (!contentType.contains("charset")) {
                    contentType = contentType + ";charset=utf-8";
                    response.getHeaders().putSingle("Content-Type", contentType);
                }
            }
        }
}

将过滤器注册为提供商。

@ApplicationPath("resources")
public class RestApplication extends ResourceConfig {
    public RestApplication() {
        HashSet<Class<?>> c = new HashSet<Class<?>>();
        c.add(PersonsRestService.class);
        c.add(ProjectsRestService.class);

        //add this
        c.add(HeaderResponseFilter.class);


        Set<Class<?>> classes = Collections.unmodifiableSet(c);
        registerClasses(classes);

        property(ServerProperties.BV_SEND_ERROR_IN_RESPONSE, true);
    }
}