我是JSON的新手,有没有办法验证json-key值对

时间:2012-12-04 10:38:49

标签: java json

Line_Of_Business = {
        LOB1           : "LOBAppType=sadfsd",  
        LOB2           : "LOBAppType=asdf",
        LOB3           : "LOBAppType=asdf}
        LOB4           : "LOBAppType=sdf",
};

Market = {
        MKTID001       :"MarketName=US||Descr=USA",
        MKTID002       "MarketName=JP||Descr=Japan""
            LOB3           : "LOBAppType=asdf",
        LOB4           : "LOBAppType=sdf",

在这个例子中,Market和Business of Business是两个json对象。有没有办法验证json对象的语法。

在市场json对象“ MKTID002 ”键和业务线“ LOB3 ”键中,语法错误且Market对象未正确关闭。

有没有找到使用java找到错误的方法

3 个答案:

答案 0 :(得分:2)

验证某些JSON的基本语法的明显方法是简单地尝试使用众多JSON解析器库之一加载/读取/解析它。 (如果解析/读取/加载成功,您可以丢弃结果数据结构)。 json.org列出许多语言的许多JSON库......包括Java。

如果构建和丢弃数据结构是一个问题,那么一些库提供与加载分开的JSON验证;例如http://www.stringtree.org/stringtree-json.html

如果只想在 ad hoc 的基础上进行此验证(即不是某些大型应用程序的一部分),请尝试jsonlint.com服务。

答案 1 :(得分:1)

使用Gson进行语法检查(使用lombok):

package com.stackoverflow.so13701022;

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonSyntaxException;
import com.google.gson.annotations.SerializedName;

import lombok.Data;

public class CheckJson {
    @Data
    private static class LineOfBusiness {
        @SerializedName("LOB1")
        private String lob1;

        @SerializedName("LOB2")
        private String lob2;

        @SerializedName("LOB3")
        private String lob3;

        @SerializedName("LOB4")
        private String lob4;
    }

    @Data
    private static class Market {
        @SerializedName("MKTID001")
        private String mktid001;

        @SerializedName("MKTID002")
        private String mktid002;

        @SerializedName("LOB3")
        private String lob3;

        @SerializedName("LOB4")
        private String lob4;
    }

    private static final String ONE = "{" + 
    "        LOB1           : \"LOBAppType=sadfsd\"," + 
    "        LOB2           : \"LOBAppType=asdf\"," + 
    "        LOB3           : \"LOBAppType=asdf}" + 
    "        LOB4           : \"LOBAppType=sdf\"," + 
    "}";

    // I corrected this one on purpose
    private static final String TWO = "{" + 
    "        MKTID001       :\"MarketName=US||Descr=USA\"," + 
    "        MKTID002       :\"MarketName=JP||Descr=Japan\"," + 
    "        LOB3           : \"LOBAppType=asdf\"," +
    "        LOB4           : \"LOBAppType=sdf\"" + 
    "}";

    public static void main(String[] args)
    {
        final Gson gson = new GsonBuilder().create();
        System.out.println(tryParse(gson, ONE, LineOfBusiness.class));
        System.out.println(tryParse(gson, TWO, Market.class));
    }

    private static <T> T tryParse(Gson gson, String what, Class<T> clazz)
    {
        try {
            return gson.fromJson(what, clazz);
        } catch (final JsonSyntaxException e) {
            System.err.println(e);
        }
        return null;
    }
}

输出(Err = stderr,Out = stdout):

(Err) com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Unterminated object at line 1 column 159
(Out) null
(Out) CheckJson.Market(mktid001=MarketName=US||Descr=USA, mktid002=MarketName=JP||Descr=Japan, lob3=LOBAppType=asdf, lob4=LOBAppType=sdf)

答案 2 :(得分:0)

对java使用任何JSON库(org.json.JSONObject),您将获得API中内置的解析和验证等所有功能。

这些库将任何String作为参数,如果它无法将字符串解析为JSONObject,则抛出异常。

 JSONObject jsob = new JSONObject(StringRepresentationOfJson);