【问题标题】:Java JSONObject does not maintaing the order of which I put things into. Trying to send into WCF serviceJava JSONObject 不维护我放入的顺序。尝试发送到 WCF 服务
【发布时间】:2010-01-20 06:21:52
【问题描述】:

这是一个奇怪的问题。我知道 JSON 应该是无序的,并且 java.lang.JSONObject 的实现特别提到它是无序的。

但是,这让我感到困惑,因为我会期待我调用 put(); 的方式。方法它应该保持我的订单。不过,这可能与我刚开始所说的相矛盾。

我正在使用 JSON 与 WCF Web 服务进行通信,这需要我包含一个 __type 键来指定我要发送的复杂对象的类型。

我强烈建议你试试这个:

    JSONObject object = new JSONObject();
    try {
     object.put("__type", "Value1");
     object.put("SecondKey", "Value2");
     object.put("ThirdKey", "Value3");
    }
    catch (JSONException e) {
     e.printStackTrace();
    }

日志中的输出是: {"ThirdKey":"Value3","__type":"Value1","SecondKey":"Value2"}

现在,我了解该实现使用 HashMap,因此不维护顺序。但是在调用 WCF 服务时,首先需要键 __type 才能在服务上进行反序列化。我怎样才能做到这一点?一段时间以来,我一直在使用纯字符串发送到运行良好的网络服务。但是,这是不可接受的,因为它丑陋且难以维护。

请从 Java 端或 WCF 端建议我如何解决这个问题。

谢谢!

【问题讨论】:

    标签: java wcf json types


    【解决方案1】:

    但是,这让我感到困惑,因为我会期待我调用 put(); 的方式。方法它应该保持我的订单。不过,这可能与我刚开始所说的相矛盾。

    是的。

    但是在调用 WCF 服务时,需要首先使用键 __type 才能在服务上进行反序列化。

    如果确实如此,那么 (IMO) 要么是服务实现中的错误,要么是 WCF 中的(如果反序列化机制是 WCF 通用的)。在前一种情况下,向服务实现者抱怨服务有问题。在后一种情况下,您可以尝试向 Microsoft 抱怨违反标准(再一次)……但您会白费口舌。

    解决此问题的正确位置是在进行反序列化的 WCF 端的代码中。但在实践中,您可能需要切换到以使 WCF 满意的方式序列化的不同 Java JSON 库。或者,也许您可​​以直接破解您当前正在使用的 JSON 库...

    【讨论】:

    • 如果 __type 不是 JSON 对象中的第一个,我会收到来自服务的“无法创建抽象类”错误。感谢您的回复!
    • @dnkoutso - 在我看来,在这种情况下,服务或 WCF 基础架构都已损坏;请参阅我的其余答案。
    • 感谢您的评论,我们正在服务器端修复此问题...
    猜你喜欢
    • 2015-09-12
    • 2012-04-12
    • 2011-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多