首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从json数组中删除对象定义,该数组位于json数组中,保持嵌套数组的完整性。

从json数组中删除对象定义,该数组位于json数组中,保持嵌套数组的完整性。
EN

Stack Overflow用户
提问于 2022-09-23 15:41:33
回答 2查看 34关注 0票数 1

我有以下xml:

代码语言:javascript
复制
<root xmlns:json='http://james.newtonking.com/projects/json'>
   <majorDimension>ROWS</majorDimension>
   <range>Sheet6!A1:B2</range>
   <values json:Array='true'>
      <element json:Array='true'>
         <element>Good</element>
         <element>Value</element>
      </element>
      <element json:Array='true'>
         <element>Hello</element>
         <element>World</element>
      </element>
   </values>
</root>

我使用以下代码:

代码语言:javascript
复制
var json = JsonConvert.SerializeXmlNode(xmlDoc, Newtonsoft.Json.Formatting.None, true);

我得到的输出是这样的

代码语言:javascript
复制
{
    "majorDimension": "ROWS",
    "range": "Sheet6!A1:B2",
    "values": [
                  { "element": [ [ "Good", "Value" ],
                                 [ "Hello", "World" ] ]
                  }
              ]
}

但是,我想得到一个类似这样的输出

代码语言:javascript
复制
{
  "range": "Sheet6!A1:B2",
  "majorDimension": "ROWS",
  "values": [
    [
        "Good",
        "Value"
    ],
    [
        "Hello",
        "World"
    ]
  ]
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-09-23 17:58:25

如果不知道更多的细节,就很难提供一个好的解决方案。应该能够反序列化为一个定义良好的C#类,并从那里操作数据。或者类似的。但无论如何。

第一个选项,注意文档

在同一级别上具有相同名称的

多个节点被分组到一个数组中。

https://www.newtonsoft.com/json/help/html/ConvertingJSONandXML.htm

因此,您可以将所有element重命名为values,并获得嵌套数组输出(不止一个请求),但它缺少{ "element" : ... JSON。不过,“元素”内容都在那里。

第二个选项是,在转换为JSON之前操作XML文档。这会将每个子element节点提升到树中与values相同的级别。唯一的考虑是输出数组被称为element而不是values

代码语言:javascript
复制
using System;
using System.Xml;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;

string xmlDoc = @"<root xmlns:json='http://james.newtonking.com/projects/json'>
   <majorDimension>ROWS</majorDimension>
   <range>Sheet6!A1:B2</range>
   <values json:Array='true'>
      <element json:Array='true'>
         <element>Good</element>
         <element>Value</element>
      </element>
      <element json:Array='true'>
         <element>Hello</element>
         <element>World</element>
      </element>
   </values>
</root>";

var xdoc = new XmlDocument();
xdoc.LoadXml(xmlDoc);
var valuesObject = xdoc.GetElementsByTagName("values")[0];
XmlNode parent = valuesObject.ParentNode;
while (valuesObject.ChildNodes.Count > 0)
{
    XmlNode child = valuesObject.ChildNodes[0];
    parent.InsertBefore(child, valuesObject);
}
parent.RemoveChild(valuesObject);

var json = JsonConvert.SerializeXmlNode(xdoc.ChildNodes[0], Newtonsoft.Json.Formatting.Indented, true);

Console.WriteLine(json);

输出

代码语言:javascript
复制
{
  "majorDimension": "ROWS",
  "range": "Sheet6!A1:B2",
  "element": [
    [
      "Good",
      "Value"
    ],
    [
      "Hello",
      "World"
    ]
  ]
}

第三个选项,将XML转换为JSON,序列化为jobject,操作结构,反序列化为string。

代码语言:javascript
复制
using System;
using System.Xml;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;

var xdoc = new XmlDocument();
xdoc.LoadXml(xmlDoc);

var jsonString = JsonConvert.SerializeXmlNode(xdoc.ChildNodes[0], Newtonsoft.Json.Formatting.Indented, true);
var jobj = JObject.Parse(jsonString);

var elements = jobj["values"][0]["element"];
// remove existing "values" node
jobj.Remove("values");
// add a new node called "values" with the contents of the "elements" array
jobj.Add("values", elements);

Console.WriteLine(jobj.ToString());

输出

代码语言:javascript
复制
{
  "majorDimension": "ROWS",
  "range": "Sheet6!A1:B2",
  "values": [
    [
      "Good",
      "Value"
    ],
    [
      "Hello",
      "World"
    ]
  ]
}
票数 1
EN

Stack Overflow用户

发布于 2022-09-23 16:18:06

将"Newtonsoft.Json.Formatting.None“替换为”Newtonsoft.Json.Formatting“。

代码语言:javascript
复制
var json = JsonConvert.SerializeXmlNode(xmlDoc, Newtonsoft.Json.Formatting.Indented, true);
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73830137

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档