【问题标题】:JSON Deserialization One or Two in Array [duplicate]JSON反序列化数组中的一两个[重复]
【发布时间】:2023-03-29 15:02:02
【问题描述】:

我遇到了 JSON DeserializeObject 方法的问题。

当我的 XML 文档在 Braches 节点内只有一个 Branch 时,我收到一个错误,因为我下面的类说分支是一个列表。我不确定如何进行此操作,因为<Branches> 中可能有一个<Branch> 或多个<Branch>

这是我的错误消息:

附加信息:无法反序列化当前 JSON 对象 (例如 {"name":"value"}) 类型为 'PluginConsoleTestCode.Branch[]' 因为该类型需要一个 JSON 数组(例如 [1,2,3])来反序列化 正确。

要修复此错误,请将 JSON 更改为 JSON 数组(例如 [1,2,3]) 或更改反序列化类型,使其成为普通的 .NET 类型(例如,不是像整数这样的原始类型,不是集合类型 像数组或列表)可以从 JSON 对象反序列化。 JsonObjectAttribute 也可以添加到类型中以强制它 从 JSON 对象反序列化。

路径 'Openers.Opener[2].Branches.Branch.@id',第 1 行,位置 689。

我的代码片段:

// XML to JSON then JSON to RootObject
var json = JsonConvert.SerializeXmlNode(xmlDoc);
var response = JsonConvert.DeserializeObject<RootObject>(json);

这是我的 XML:

<Openers>
    <Opener Name="Name1" UserId="username">
        <Branches>
            <Branch id="103"></Branch>
            <Branch id="104"></Branch>
            <Branch id="105"></Branch>
            <Branch id="106"></Branch>
            <Branch id="107"></Branch>
            <Branch id="108"></Branch>
        </Branches>
    </Opener>
    <Opener Name="Name2" UserId="username">
        <Branches>
            <Branch id="109"></Branch>
            <Branch id="110"></Branch>
            <Branch id="111"></Branch>
            <Branch id="112"></Branch>
        </Branches>
    </Opener>
    <Opener Name="Name3" UserId="username">
        <Branches>
            <Branch id="113"></Branch>
        </Branches>
    </Opener>
</Openers>

XML 转换为 JSON:

{
  "Openers": {
    "Opener": [
      {
        "@Name": "Name1",
        "@UserId": "username",
        "Branches": {
          "Branch": [
            { "@id": "103" },
            { "@id": "104" },
            { "@id": "105" },
            { "@id": "106" },
            { "@id": "107" },
            { "@id": "108" }
          ]
        }
      },
      {
        "@Name": "Name2",
        "@UserId": "username",
        "Branches": {
          "Branch": [
            { "@id": "109" },
            { "@id": "110" },
            { "@id": "111" },
            { "@id": "112" }
          ]
        }
      },
      {
        "@Name": "Name3",
        "@UserId": "username",
        "Branches": {
          "Branch": { "@id": "113" }
        }
      }
    ]
  }
}

这是我的课程:

public class Branch
{
    [JsonProperty("@id")]
    public string Id { get; set; }
}

public class Branches
{
    [JsonProperty("Branch")]
    public List<Branch> Branch { get; set; }
}

public class Opener
{
    [JsonProperty("@Name")]
    public string Name { get; set; }
    [JsonProperty("@UserId")]
    public string UserId { get; set; }
    public Branches Branches { get; set; }
}

public class Openers
{
    public List<Opener> Opener { get; set; }
}

public class RootObject
{
    public Openers Openers { get; set; }
}

【问题讨论】:

  • 您在 JSON 中有 -UserId-Name
  • @DanielA.White 和 -id 而不是 id
  • 其实那是个错误。 JSON 响应返回 @Id 和 @UserId 和 @Name。那不是问题。已在代码中修复。
  • 问题在于创建 JSON 时使用单个 Branch 元素,其中包含多个 Id 元素,而不是 Branches 中的多个 Branch 元素,每个元素都有一个 @ 987654338@元素。
  • 您对创建的 XML 有控制权吗?

标签: c# xml json json.net deserialization


【解决方案1】:

你的结构为什么这么复杂? 你为什么不只是关注

public class Branch
{
    [JsonProperty("@id")]
    public string Id { get; set; }
}

public class Opener
{
    [JsonProperty("@Name")]
    public string Name { get; set; }
    [JsonProperty("@UserId")]
    public string UserId { get; set; }
    [XmlArray("Branches")]
    [XmlArrayItem("branch", typeof(Branch))]
    public List<Branch> Branches { get; set; }
}


public class RootObject
{
    [XmlArray("Openers")]
    [XmlArrayItem("opener", typeof(Opener))]
    public List<Opener> Openers { get; set; }
}

其他属性应该自动工作。如果没有,添加所有XMLAttributeXMLElement

编辑:当有系统 xmlserializers 时,为什么要使用 json.net 反序列化 xml?

【讨论】:

  • 这对我不起作用。我收到一条错误消息。 Additional information: Cannot deserialize the current JSON object (e.g. {"name":"value"}) into type 'System.Collections.Generic.List1[PluginConsoleTestCode.Opener]' 因为该类型需要 JSON 数组(例如 [1,2,3])才能正确反序列化。路径“Openers.Opener”,第 1 行,位置 21。
  • 抱歉这么久,但我发现一些repo 有一些测试任务,我在你提出问题前一个月做了一些测试任务并忘记了。这就是你所需要的。 XML -> 对象 -> json,使用 json.net 和嵌套数据列表(数据链接在解决方案中的某处)
【解决方案2】:

您可以使用属性json:Array 强制转换器将节点转换为数组。

http://www.newtonsoft.com/json/help/html/ConvertXmlToJsonForceArray.htm

在您的示例中,它看起来像这样

<Openers xmlns:json='http://james.newtonking.com/projects/json' json:Array='true'>
<Opener Name="Name1" UserId="username">
    <Branches json:Array='true'>
        <Branch id="103"></Branch>
        <Branch id="104"></Branch>
        <Branch id="105"></Branch>
        <Branch id="106"></Branch>
        <Branch id="107"></Branch>
        <Branch id="108"></Branch>
    </Branches>
</Opener>
<Opener Name="Name2" UserId="username">
    <Branches json:Array='true'>
        <Branch id="109"></Branch>
        <Branch id="110"></Branch>
        <Branch id="111"></Branch>
        <Branch id="112"></Branch>
    </Branches>
</Opener>
<Opener Name="Name3" UserId="username">
    <Branches json:Array='true'>
        <Branch id="113"></Branch>
    </Branches>
</Opener>
</Openers>

【讨论】:

  • 我收到了一个错误...
  • @Turp 你遇到了什么错误?
  • 附加信息:无法将当前 JSON 对象(例如 {"name":"value"})反序列化为类型 'System.Collections.Generic.List`1[PluginConsoleTestCode.Opener]' 因为类型需要一个 JSON 数组(例如 [1,2,3])才能正确反序列化。
  • 要修复此错误,要么将 JSON 更改为 JSON 数组(例如 [1,2,3]),要么将反序列化类型更改为正常的 .NET 类型(例如,不是原始类型像整数,而不是可以从 JSON 对象反序列化的集合类型(如数组或 List)。 JsonObjectAttribute 也可以添加到类型中以强制它从 JSON 对象反序列化。
  • 标签中有xmlns:json="http://james.newtonking.com/projects/json"。以及每个Branches 标签中的json:Array="true"
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多