【问题标题】:JSON Parsing: JSON data using JSON properties for Array DataJSON 解析:使用 JSON 属性的 JSON 数据用于数组数据
【发布时间】:2014-12-20 12:50:07
【问题描述】:

我有这样的 JSON 数据...

{
     "generated" : "Sat, 20 Dec 3049 12:30:01",
     "1" : { ... },
     "2" : { ... },
     ...
     "2400" : { ... },
}

就个人而言,我希望使用 JSON 数组语法输出一个对象数组(这是我第一次尝试使用 JSON)。我正在使用 Json.Net 尝试将这种混乱解析为对象模型以进行查询并最终显示。

我打算使用 JsonSerializationAttribute 方法将 JSON 转换为对象模型。我已经尝试直接使用 XML,但显然这个特定的 JSON 文件与 XML 不兼容(“1”是无效的 XML 元素名称)。

我的初始对象模型类代表上面JSON的高级sn-p如下:

public class MwoMapData
{
    [JsonProperty(PropertyName = "generated")]
    public DateTime Generated { get; set; }
    [JsonArray]
    public List<Planet> Planets { get; set; }
}

我读过的资源基本上说数组并没有像现在这样表示,我完全不知道如何用Json.Net 将它解析到我的对象模型中。

我的问题是:如何使用Json.NetJsonSerializationAttributes 将对象属性转换为数组?

【问题讨论】:

  • 数组在哪里?有带字段的 JSON 对象,但没有数组
  • 在 Java 中,我曾与 Jackson (mkyong.com/java/how-to-convert-java-object-to-from-json-jackson) 合作,以便将 JSON 传递给对象。它允许您根据需要获取 JSON(例如,作为地图)。
  • @Sergey:“字段”是项目的动态列表,显然是所引用对象的 ID。例如,为什么有人会序列化名称为“1”的属性,尤其是在存在数组语法的情况下?这显然是一个大型数据集,而不是具有属性的实际对象。
  • @Marc:不相关,我正在使用 C#,问题是如何将这些属性反序列化为数组。
  • @toadflakz 例如,为什么有人会序列化名称为“1”的属性,尤其是当数组语法存在时? JSON 具有数组语法,而您的 JSON 是不使用它。如果您的反序列化程序仅仅因为它具有数字属性名称(尤其是当它具有非数字属性名称时)就假设它是一个数组,那将是相当冒昧的。

标签: c# arrays json json.net


【解决方案1】:

如果您使用 Json.NET,您可以通过创建一个继承自抽象类 JsonConverter 的类来实现自定义 Deserialzer。然后,您可以覆盖名为 ReadJson 的方法:

class CustomJson : JsonConverter
    {
        public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
        {
            //if you only deserialize, you will probably not need this
        }

        public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
        {
            var output = new object(); //instance of your class
            do
            {
                if (reader.TokenType == JsonToken.PropertyName)
                {
                    int number;
                    if (int.TryParse(reader.Value.ToString(), out number))
                    {
                        //detecting the number
                    }
                    else
                    {
                        //not a number
                    }
                }
                else
                {
                    //read other stuff
                }    
            } while (reader.Read());

            return output;
        }

        public override bool CanConvert(Type objectType)
        {
            //detect your type
        }
    }

然后使用它:

var deserialized = JsonConvert.DeserializeObject<YourClass>(json, new CustomJson());

有关如何实现 JsonConverter 类的其他提示,请参阅此帖子:

【讨论】:

  • 谢谢 - 我希望这是默认功能,但哦,好吧!
  • Json.NET 反序列化对象,因为它们以 JSON 字符串表示。仅当输入 JSON 具有不同的语法(例如在您的示例中)并且您想以不同的方式解析属性时 - 然后您实现 JsonConverter 类。
【解决方案2】:

您使用此代码对其进行反序列化

Dictionary<string,Yourclass> data = JsonConvert.DeserializeObject<Dictionary<string,Yourclass>>(jsonString);

然后你可以遍历你的字典

【讨论】:

  • 即使它在 JSON 中有“生成”属性?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-15
  • 2022-01-23
  • 2011-07-08
相关资源
最近更新 更多