19

我是在 Java 中使用 json-simple 库的新手,我已经完成了编码解码示例。复制编码示例很好,但我无法让解码示例与混合类型 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-simple 官方解码教程中,我尝试解码这个 JSON:

{
"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 的最简单方法是什么?

4

4 回答 4

27

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

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 文件package然后在您的项目中创建一个org.json作为名称。并将所有下载的代码粘贴到那里,玩得开心。

我觉得这是最好和最简单的 JSON 解码。

于 2013-05-16T11:20:32.633 回答
4

那么你的 jsonString 是错误的。

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 库,有很多。最好检查一下

于 2013-05-16T07:48:49.697 回答
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");
于 2013-12-10T10:09:41.710 回答
3

无需按照 Veer 的建议下载单独的 java 文件,您只需将此JAR 文件添加到您的包中即可。

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

  1. 右键单击您的项目,单击构建路径 > 配置构建路径
  2. 转到库选项卡 > 添加外部 JAR
  3. 找到 JAR 文件并添加
于 2015-04-12T19:56:01.883 回答