.NET Web 服务响应中的排序字段
Ordering fields in .NET web service response
我正在从移动应用程序调用 .NET Web 服务(我认为是 WCF,我不是 .NET 专家)以获得 JSON 响应,我想对字段重新排序。是的,我知道 JSON 的规范(在某种程度上有这样的事情)说它不支持排序。在更新客户端应用程序以对数据进行排序之前,我只是想找到一种从 Web 服务订购响应字符串的方法。
我发现了这个:https://msdn.microsoft.com/en-us/library/ms729813.aspx
但是在每个字段上使用 [DataMember(Order = 0)]
(当然具有不同的排序值)对响应中字段的顺序没有影响。此属性是否仅适用于 XML 个响应?
您的 JSON 属性的顺序通常无关紧要,因为 JSON 几乎总是被反序列化为一个对象。一旦发生这种情况,属性的原始“顺序”就变得毫无意义。
例如,考虑以下代码:
const data = JSON.parse('{ "a": "Aquaman", "b": "Batman", "c": "Catwoman" }');
// data.a == "Aquaman"
// data.b == "Batman"
// data.c == "Catwoman"
更改这些属性的顺序不会影响反序列化的对象。大多数面向对象的语言,包括 JavaScript、Java 和 C#,都没有内置的 属性“顺序”概念。
const data = JSON.parse('{ "c": "Catwoman", "b": "Batman", "a": "Aquaman" }');
// data.a == "Aquaman"
// data.b == "Batman"
// data.c == "Catwoman"
如果您的客户端应用程序在输出 CSV 文件之前反序列化 JSON,则 JSON 属性的顺序将不会影响 CSV 字段的顺序。
更改 CSV 字段的顺序将需要更新应用程序。
您 可以 编写自己的 JSON 序列化程序以确保属性的顺序符合要求,然后编写您自己的 JSON 解析器来转换JSON 将字符串直接转换为 CSV,从而保留这些字段的顺序。将 JSON 反序列化为对象会破坏字段顺序信息,因此您必须直接从原始 JSON 字符串转为 CSV。
或者您可以更改 JSON 的格式以使用数组等,它们会保留元素顺序。类似于:
const data = JSON.parse('{ "c": "Catwoman", "b": "Batman", "a": "Aquaman", "__fieldMeta": { "order": [ "c", "b", "a" ] } }');
// data.__fieldMeta.order[0] == "c"
// data.__fieldMeta.order[1] == "b"
// data.__fieldMeta.order[2] == "a"
或者您可以切换到保留元素顺序的序列化格式,例如 XML。
<data c="Catwoman" b="Batman" a="Aquaman" />
const dom = (new DOMParser()).parseFromString(
`<data c="Catwoman" b="Batman" a="Aquaman" />`, "application/xml");
// dom.firstElementChild.attributes[0].localName == "c"
// dom.firstElementChild.attributes[1].localName == "b"
// dom.firstElementChild.attributes[2].localName == "a"
不幸的是,所有这些选项都需要更新客户端应用程序。我认为没有办法解决这个问题。
我正在从移动应用程序调用 .NET Web 服务(我认为是 WCF,我不是 .NET 专家)以获得 JSON 响应,我想对字段重新排序。是的,我知道 JSON 的规范(在某种程度上有这样的事情)说它不支持排序。在更新客户端应用程序以对数据进行排序之前,我只是想找到一种从 Web 服务订购响应字符串的方法。
我发现了这个:https://msdn.microsoft.com/en-us/library/ms729813.aspx
但是在每个字段上使用 [DataMember(Order = 0)]
(当然具有不同的排序值)对响应中字段的顺序没有影响。此属性是否仅适用于 XML 个响应?
您的 JSON 属性的顺序通常无关紧要,因为 JSON 几乎总是被反序列化为一个对象。一旦发生这种情况,属性的原始“顺序”就变得毫无意义。
例如,考虑以下代码:
const data = JSON.parse('{ "a": "Aquaman", "b": "Batman", "c": "Catwoman" }');
// data.a == "Aquaman"
// data.b == "Batman"
// data.c == "Catwoman"
更改这些属性的顺序不会影响反序列化的对象。大多数面向对象的语言,包括 JavaScript、Java 和 C#,都没有内置的 属性“顺序”概念。
const data = JSON.parse('{ "c": "Catwoman", "b": "Batman", "a": "Aquaman" }');
// data.a == "Aquaman"
// data.b == "Batman"
// data.c == "Catwoman"
如果您的客户端应用程序在输出 CSV 文件之前反序列化 JSON,则 JSON 属性的顺序将不会影响 CSV 字段的顺序。
更改 CSV 字段的顺序将需要更新应用程序。
您 可以 编写自己的 JSON 序列化程序以确保属性的顺序符合要求,然后编写您自己的 JSON 解析器来转换JSON 将字符串直接转换为 CSV,从而保留这些字段的顺序。将 JSON 反序列化为对象会破坏字段顺序信息,因此您必须直接从原始 JSON 字符串转为 CSV。
或者您可以更改 JSON 的格式以使用数组等,它们会保留元素顺序。类似于:
const data = JSON.parse('{ "c": "Catwoman", "b": "Batman", "a": "Aquaman", "__fieldMeta": { "order": [ "c", "b", "a" ] } }');
// data.__fieldMeta.order[0] == "c"
// data.__fieldMeta.order[1] == "b"
// data.__fieldMeta.order[2] == "a"
或者您可以切换到保留元素顺序的序列化格式,例如 XML。
<data c="Catwoman" b="Batman" a="Aquaman" />
const dom = (new DOMParser()).parseFromString(
`<data c="Catwoman" b="Batman" a="Aquaman" />`, "application/xml");
// dom.firstElementChild.attributes[0].localName == "c"
// dom.firstElementChild.attributes[1].localName == "b"
// dom.firstElementChild.attributes[2].localName == "a"
不幸的是,所有这些选项都需要更新客户端应用程序。我认为没有办法解决这个问题。