【问题标题】:JSONObject is not created correctelyJSONObject 未正确创建
【发布时间】:2016-01-14 02:46:53
【问题描述】:

我创建JsonObjectJsonArray 如下:

JSONObject jObj = new JSONObject();
jObj.put("path", "dfds/g");
jObj.put("etag", "dfdsfsd");
jObj.put("size_bytes", 123);
JSONArray list = new JSONArray();
list.add(jObj);
String s = list.toJSONString();

我得到的结果:

[{"size_bytes":123,"etag":"dfdsfsd","path":"dfds\/g"}]
  1. 我希望路径组件是"path":"dfds\g",而不是dfds\/g
  2. 我需要该字段按照我在代码中的顺序排列,但它们与我预期的不同:path, etag, size_bytes 我很高兴得到如何解决上述问题的建议

【问题讨论】:

  • 对象中元素的顺序无关紧要,无论如何,您都应该能够与JSON 相互转换。 backslash 似乎逃脱了 forwardslash

标签: java json


【解决方案1】:

Json 编码器正在转义你的正斜杠,这就是你得到\/ 的原因。这是完全合法的语法,无需担心。

您不必担心 Json 字符串中的排序问题,字段本质上是无序的,依赖它很可能会在未来给您带来问题。

【讨论】:

  • json 字符串被发送到其他进程,它期望路径没有'\':无法读取'dfds\/g',需要'dfds\g'
  • 我最好的建议是使用 JSON 解码器而不是尝试手动完成
  • 我形成 json 字符串并将其发送到其他进程。该过程是3方。我只知道它期望没有'\'的路径
  • 你真的试过发送吗?如果第三者是明智的,他们将能够很好地处理这个问题。
  • 好吧,第三者,不管他们说什么,都使用 JSON 格式。你能让他们在最后解决这个问题吗?
【解决方案2】:

如果您绝对必须从字符串中删除正斜杠,那么您可以这样做:

s = s.replace("\\/", "/");

更多信息请参见String replace a Backslash

我建议在这种情况下不要这样做。相反,您应该使用众多 JSON 解析库之一来解析 String

这是一个与您的示例 String 一起使用的示例:

public static void main(String[] args){
    String s = "[{\"size_bytes\":123,\"etag\":\"dfdsfsd\",\"path\":\"dfds\\/g\"}]";
    
    System.out.println(s);
    
    s = s.replace("\\/", "/");
    
    System.out.println(s);
}

输出:

[{"size_bytes":123,"etag":"dfdsfsd","path":"dfds\/g"}]

[{"size_bytes":123,"etag":"dfdsfsd","path":"dfds/g"}]

【讨论】:

  • 我不做解析。我只是应该将具有正确格式的字符串发送到其他进程。该过程是3方。我只知道它期望没有'\'的路径
  • @Yakov 很好,然后做 s.replace() 应该可以工作,ymmv
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-03-02
  • 1970-01-01
  • 2013-09-29
  • 2018-05-07
  • 2022-07-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多