【发布时间】:2016-05-17 19:16:09
【问题描述】:
我有一个 WCF 服务 POST 方法,如下所示:
[WebInvoke(Method = "POST", BodyStyle = WebMessageBodyStyle.WrappedResponse, ResponseFormat = WebMessageFormat.Json,
RequestFormat = WebMessageFormat.Json, UriTemplate = "GetResult/{schoolid}")]
[return: MessageParameter(Name = "ExamResult")]
CResults GetExamResult(CExamResultQuery pObj, string schoolid);
这里是 CResults 类:
public class CResults
{
public string studentname { get; set; }
public string studentid { get; set; }
public string telugu { get; set; }
public string hindi { get; set; }
public string english { get; set; }
public string mathematics { get; set; }
public string science { get; set; }
public string social { get; set; }
public string totalresult { get; set; }
}
我在客户端的 Post 响应中收到一个 JSON 字符串,但键(值)的顺序不同。这是 JSON:
"{\"ExamResult\":{\"english\":\"80\",\"hindi\":\"80\",\"mathematics\":\"80\",\"science\":\"80\",\"social\":\"80\",\"studentid\":\"50\",\"studentname\":\"Ashok\",\"telugu\":\"80\",\"totalresult\":\"PASS\"}}"
我看到 JSON 按字母顺序而不是 Class 变量顺序。如何以与我的班级相同的方式制作 JSON 订单。
这是我从 JSON 字符串中提取键和值的方法
JSONObject jsonRootObject = new JSONObject(jsonData);
JSONObject innerObj = jsonRootObject.getJSONObject("ExamResult");
Iterator<?> keys = innerObj.keys();
while (keys.hasNext()) {
String key = (String) keys.next();
mActivity.updateResultsTable(""+key+": "+innerObj.get(key).toString());
// Log.i("testExtrace JSONObject", "key " + key + ": value " + innerObj.get(key).toString());
}
我知道我可以使用如下键提取 JSON 值:
String studentName= jsonRootObject.getString("studentname");
我只想更改 WCF 类,这可能有助于按我期望的顺序提取任何 JSON。
感谢支持
【问题讨论】:
-
为什么提取顺序很重要?在您提取值(以它们出现的任何顺序)之后,是什么阻止您以其他方式对它们进行排序?
-
@BrianRogers 我知道我可以提取。想知道如何在 C# 中完成。
-
您可以使用
[DataMember(Order = X)]。见How do I control the order of properties in my JSON output?。但是根据JSON standard,JSON 对象是一组无序的名称/值对,因此使您的代码依赖于属性顺序是不标准的。 -
@dbc +1 感谢您的解决方案和链接。搞砸了我对你的投票。对不起