使用json-simple库在Java中解码JSON字符串

20
我是一个新手,正在使用Java中的json-simple库。我已经查看了encodingdecoding示例。复制编码示例很容易,但我无法将解码示例与混合类型JSON一起使用。
我的问题之一是该库中有太多未经适当记录的类,而且我没有它们的源代码(以便能够阅读并理解它们的用途)。因此,我很难理解如何使用许多这些类。
在阅读了这个示例之后:
String jsonText = "{\"first\": 123, \"second\": [4, 5, 6], \"third\": 789}";
JSONParser parser = new JSONParser();

ContainerFactory containerFactory = new ContainerFactory(){
    public List creatArrayContainer() {
        return new LinkedList();
    }

    public Map createObjectContainer() {
        return new LinkedHashMap();
    }                     
};

try {
    Map json = (Map)parser.parse(jsonText, containerFactory);
    Iterator iter = json.entrySet().iterator();
    System.out.println("==iterate result==");

    while(iter.hasNext()) {
        Map.Entry entry = (Map.Entry)iter.next();
        System.out.println(entry.getKey() + "=>" + entry.getValue());
    }

    System.out.println("==toJSONString()==");
    System.out.println(JSONValue.toJSONString(json));
} catch(ParseException pe) {
    System.out.println(pe);
}

我尝试解码这个JSON,来自于json-simple官方解码教程

{
"stat":{
    "sdr": "MAC address of FLYPORT",
    "rcv": "ff:ff:ff:ff:ff:ff",
    "time": "0000000000000",
    "type": 0,
    "subt": 0,
    "argv": [
        {"type": "6","val": "NetbiosName"},
        {"type": "6","val": "MACaddrFlyport"},
        {"type": "6","val": "FlyportModel"},
        {"type": "1","val": id}
    ]
}
}

我正在编写以下代码来解码:

    String jsonString = "{\"stat\":{\"sdr\": \"aa:bb:cc:dd:ee:ff\",\"rcv\": \"aa:bb:cc:dd:ee:ff\",\"time\": \"UTC in millis\",\"type\": 1,\"subt\": 1,\"argv\": [{1,2},{2,3}]}}";
    JSONObject jsonObject = new JSONObject(jsonString);
    JSONObject newJSON = jsonObject.getJSONObject("stat");
    System.out.println(newJSON);

但它不起作用。事实上,我甚至无法使未修改的示例工作,并且原始作者也没有解释他们的代码。
如何以最简单的方式解码所示的JSON?

你能让我们看看你解码状态的代码吗? - Ray Stojonic
你有没有查看JSON官方解码教程中的示例5(可停止的SAX样式内容处理程序)?我发现该代码仅适用于单个字典(Map)/数组。但是你正在尝试使用包含多个字典的字典中的json。如果我错了,请纠正我。 - ram2013
@ram2013:是的,我需要解码的是嵌套的地图... 我猜这就是其中之一。如果我获取到"stat"的值,我可以用它来进行进一步的JSON解码。 - Sharda Singh
1
如果你问我最简单的方法?这个 >> https://code.google.com/p/google-gson/ - Niks
1
首先,你的 jsonString 不是一个有效的 JSON。而 argv 里面的那个东西是什么? - anvarik
4个回答

26

这是最好且最简单的代码:

public class test
{
    public static void main(String str[])
    {
        String jsonString = "{\"stat\": { \"sdr\": \"aa:bb:cc:dd:ee:ff\", \"rcv\": \"aa:bb:cc:dd:ee:ff\", \"time\": \"UTC in millis\", \"type\": 1, \"subt\": 1, \"argv\": [{\"type\": 1, \"val\":\"stackoverflow\"}]}}";
        JSONObject jsonObject = new JSONObject(jsonString);
        JSONObject newJSON = jsonObject.getJSONObject("stat");
        System.out.println(newJSON.toString());
        jsonObject = new JSONObject(newJSON.toString());
        System.out.println(jsonObject.getString("rcv"));
       System.out.println(jsonObject.getJSONArray("argv"));
    }
}

这里提供了JSON文件的库定义,这不是你发布的这个库。你发布的是简单的JSON库,我用的是这个库

你可以下载zip文件,然后在你的项目中创建一个以org.json为名称的package,将所有下载的代码粘贴到该处,开始使用吧。

我认为这是最好、最简单的JSON解码方法。


我们如何在JSON中给"添加转义符\?我不想使用String.replace()方法。 - Identity1
我一直得到这个输出: “一个 JSONObject 文本必须以 '{' 开始,位于 1 [第 2 行字符]”我的 JSON 内容在第二个 "{" 之前没有任何内容。 - Chandough
org.json是最糟糕的解决方案之一。它的性能非常差,功能集也很有限。这主要是因为它是由其创建者在json早期开发的一个概念验证库。在选择之前请考虑性能:https://github.com/fabienrenaud/java-json-benchmark(使用JMH完成)。jackson是您的最佳选择。 - fabien
first link is 404 - Kevin Beal

4

你的json字符串是错误的。

String jsonString = "{\"stat\":{\"sdr\": \"aa:bb:cc:dd:ee:ff\",\"rcv\": \"aa:bb:cc:dd:ee:ff\",\"time\": \"UTC in millis\",\"type\": 1,\"subt\": 1,\"argv\": [{\"1\":2},{\"2\":3}]}}";

使用此 jsonString,如果您在示例中使用相同的 JSONParserContainerFactory,则会看到它将被编码/解码。

此外,如果您想在 stat 之后打印字符串,可以这样做:

     try{
        Map json = (Map)parser.parse(jsonString, containerFactory);
        Iterator iter = json.entrySet().iterator();
        System.out.println("==iterate result==");
        Object entry = json.get("stat");
        System.out.println(entry);
      }

关于json库,有很多种。建议你查看这里


3
这是我们想要解码的JSON字符串:
{ 
   "stats": { 
       "sdr": "aa:bb:cc:dd:ee:ff", 
       "rcv": "aa:bb:cc:dd:ee:ff", 
       "time": "UTC in millis", 
       "type": 1, 
       "subt": 1, 
       "argv": [
          {"1": 2}, 
          {"2": 3}
       ]}
}

我将这个字符串存储在变量名为"sJSON"的变量中。 现在,这是如何解码它的方法 :)
// Creating a JSONObject from a String 
JSONObject nodeRoot  = new JSONObject(sJSON); 

// Creating a sub-JSONObject from another JSONObject
JSONObject nodeStats = nodeRoot.getJSONObject("stats");

// Getting the value of a attribute in a JSONObject
String sSDR = nodeStats.getString("sdr");

1
“stat”缺少字母“s”,应该是JSONObject nodeStats = nodeRoot.getJSONObject("stats");,对吗? - Volodymyr Balytskyy
1
似乎 JSONObject 不再具有接受字符串的初始化程序。 - Peter Schorn

3

与Veer建议的下载单独的Java文件不同,您可以将此JAR文件添加到您的包中。

要在Eclipse中将jar文件添加到您的项目中,请执行以下操作:

  1. 右键单击您的项目,单击Build Path > Configure Build Path
  2. 转到Libraries选项卡 > 添加外部JAR
  3. 找到JAR文件并添加

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接