0

我正在尝试使用 C++ REST SDK lib 编写一个 C++ 应用程序,它将处理由 C# 应用程序生成的 JSON 数据。AC# 程序可以生成“包装”或“裸”样式的 JSON。

使用BodyStyle = WebMessageBodyStyle.Wrapped,C# 生成如下 JSON:

{"Echo":"{\"firstname\":\"an'",\"number\":21,\"secondname\":\"pn\"}"}

使用BodyStyle = WebMessageBodyStyle.Bare,C# 生成如下 JSON:

"{\"firstname\":\"an'",\"number\":21,\"secondname\":\"pn\"}"

我的程序如何识别产生了哪种类型:WrappedBare

4

1 回答 1

2

JSON 是一种用于表示和交换数据的标准格式。它没有定义WrappedBare术语。我不熟悉 C# 及其将数据编码为 JSON 的库,但是我可以根据您提供的示例进行猜测。

如果您可以控制 C# 应用程序,请将其编码为仅使用Bare。一般来说,我认为Wrapped样式没有优势。也许它是专门为其他一些 C# 客户端库设计的。

我在生成的输出中看到的唯一区别是数据的结构。没有办法绝对确定,但是从这两个示例中,您可以简单地查看反序列化的对象并检查它是否具有属性Echo。如果是,则使用该属性的值,如果不是,则按原样使用该对象。

由于我已经有十多年没有使用 C++ 工作了,而且我不知道您使用的 JSON 库,所以我将在 JavaScript 中给出一个示例(尽管使用的样式可能更接近 C++)。以下是如何处理这两个对象:

var data = JSON.parse(...); // the '...' represents where ever you get the text
if (data["Echo"] !== undefined)
    { data = data["Echo"]; }
console.log("The first name is:", data["firstname"]);

这是一个几乎是有效 Java 的伪代码示例,可能更容易识别并翻译成 C++:

Map<String, Object> data = JSON.parse(...); // the '...' represents where ever you get the text
if (data.containsKey("Echo"))
    { data = (Map)data.get("Echo"); }
System.out.println("The first name is: " + data.get("firstname"));
于 2015-08-21T15:53:28.493 回答