当前位置: 首页 > 知识库问答 >
问题:

将JSON字符串反序列化为C#类,其中JSON类可以根据JSON属性接受数组/对象

慕皓君
2023-03-14

为了绑定到网格,我必须将JSON字符串反序列化为C#类。我用C#实现了相应的类。但在特定实例中,这将失败,因为JSON属性将是一个数组或一个对象。请检查字符串的一部分。

我已经创建了ItemList类,它有3个属性IL1、Name和另一个对象类“Item”。但是,您可以看到,当属性“name”是Rubber时,我应该将Item class列表作为属性而不是Item对象。当它是橡胶时,它返回2个项目的数组。

 "ItemList": [
{
  "@IL1": "Yes",
  "@Name": "Pencil"
  "Item": {
    "@ItemType": "Pencil",
    "@Item2": "1A7716744F7048ACA2549BE93F0A2BF1",        
    "aimLink": {
      "@id": "1A7716744F7048ACA2549BE93F0A2BF1",
      "@DisplayText": "P00001"         
    }
  }
},
{
  "@IL1": "Yes",
  "@Name": "Pen",    
  "Item": {
    "@ItemType": "Pen",
    "@Item2": "AE067F7EDB6147C09AED243C1F7FAD25",        
    "aimLink": {
      "@id": "AE067F7EDB6147C09AED243C1F7FAD25",
      "@DisplayText": "5100010654120001
    }
  }
},
{
  "@IL1": "Yes",
  "@Name": "Rubber",     
  "Item": [
    {
      "@ItemType": "Rubber",
      "@ItemGID": "622025629037499394DF092DA16BAB7F",          
      "aimLink": {
        "@id": "622025629037499394DF092DA16BAB7F",
        "@DisplayText": "12345678-1234-123456-7116#01"
      }
    },
    {
      "@ItemType": "Rubber",
      "@ItemGID": "F336F65F8E014E80B84A2312F829493C"
      "aimLink": {
        "@id": "F336F65F8E014E80B84A2312F829493C",
        "@DisplayText": "12345678-1234-123456-7116#14"
      }
    }
  ]
}
 ],

我怎样才能有效地将它解析成一个C#类,以及实现这一目标的最简单的方法呢?

谢谢,Divya

共有2个答案

夏侯朝斑
2023-03-14

您可以自定义JSONConverter(例如ItemConverter)并使用[JSONConverter(typeof(ItemConverter))]属性标记Item属性

有品
2023-03-14

您可以通过自定义JSONConverter来解决此问题,您可以使用下面的方法将单个值转换为数组,然后使用JSONConverter属性标记Item属性

public class SingleValueArrayConverter<T> : JsonConverter
{
    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        throw new NotImplementedException();
    }



    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        object retVal = new Object();
        if (reader.TokenType == JsonToken.StartObject)
        {
            T instance = (T)serializer.Deserialize(reader, typeof(T));
            retVal = new List<T>() { instance };
        }
        else if (reader.TokenType == JsonToken.StartArray)
        {
            retVal = serializer.Deserialize(reader, objectType);
        }
        return retVal;
    }

    public override bool CanConvert(Type objectType)
    {
        return false;
    }
}

假设这是ItemList

public class ItemList
{
    public string @IL1 { get; set; }
    public string @Name { get; set; }
    [JsonConverter(typeof(SingleValueArrayConverter<Item>))]
    public List<Item> Item { get; set; }
}

public class Item
{
    public string @ItemType { get; set; }
    public string @Item2 { get; set; }
    public AimLink aimLink { get; set; }
}

public class AimLink
{
    public string @id { get; set; }
    public string @DisplayText { get; set; }
}
 类似资料:
  • 问题内容: 我有一些具有各种属性的JSON,其中大多数是简单数据类型。但是,我在JSON中有一个属性,当我将其反序列化为C#类时,我只需要将其反序列化为字符串即可。 JSON示例: 除了将是有效的JSON对象外,“ json”对象没有任何设置结构。 因此,在上面的示例中,“ json”的值是一个JSON对象-但是当它反序列化时,我需要将它作为字符串。 因此,如果我的C#类是: 然后,如果我使用:

  • 问题内容: 可以说我有以下格式的JSON: 我试图避免自定义反序列化器,并尝试将上述JSON(称为Wrapper.java)反序列化为Java POJO。“类型”字段指示“对象”反序列化,即。type = foo表示使用Foo.java反序列化“ object”字段。(如果type = Bar,则使用Bar.java反序列化对象字段)。元数据/所有者将始终使用相同的反序列化方式,每个方法都使用一个

  • 问题内容: 我在反序列化一些json数据,获取InvalidCastExceptions之类的问题。 谁能指出我正确的方向? 这是我要反序列化的json; [{“ OrderId”:0,“名称”:“摘要”,“ MaxLen”:“ 200”},{“ OrderId”:1,“名称”:“详细信息”,“ MaxLen”:“ 0”}] 这是我的代码; 问题答案: OrderId是json中的一个Int(请注

  • 我需要反序列化以下json: 将它的< code>id属性设置为< code>foo_id json属性。 我需要在自定义反序列化程序中执行此操作。实现这一点最简单的方法是什么? 我想以某种方式将json“转换”为 然后将此委托给杰克逊。 在本例中,对象的类型为Foo,但其他对象可能不属于此类。另外,在本例中,json是一个数字,但如果它也是一个字符串,我希望支持。所以,我需要一种通用的方法来做到

  • 问题内容: 我有这个字符串: 我正在反序列化对象: 该对象看起来像: 并尝试创建字典: 但得到。 可能是什么问题? 问题答案: 请参阅mridula的答案,了解为什么您会得到null。但是,如果您想直接将json字符串转换为字典,则可以尝试以下代码段。

  • 问题内容: 我有以下字符串 我想反序列化一个类的对象 我正在使用python 2.6和2.7 问题答案: