发布
社区首页 >问答首页 >是否可以用Json.NET反序列化内联数组?

是否可以用Json.NET反序列化内联数组?
EN

Stack Overflow用户
提问于 2019-06-01 17:43:03
回答 1查看 131关注 0票数 0

让我试图通过从一个复杂的对象和大型JSON文本中提取和抽象相关信息来简化我的问题。

代码语言:javascript
代码运行次数:0
复制
Class Foo()
{
  string Name;
  Version[] versions;
}

JsonText(从XML转换而来)可以是这样的:

代码语言:javascript
代码运行次数:0
复制
  "Foo": {
    "Name": "test",
    "versions": {
        "Major": "1",
        "Minor": "1"
    },
    "versions": {
        "Major": "2",
        "Minor": "1"
    },
    "versions": {
        "Major": "3",
        "Minor": "1"
    }
    }

或如下:

代码语言:javascript
代码运行次数:0
复制
  "Foo": {
    "Name": "test",
    "versions": {
        "Major": "1",
        "Minor": "1"
    }
    }

JsonConvert.DeserializeObject(JsonText)的结果是:

代码语言:javascript
代码运行次数:0
复制
Cannot deserialize the current JSON object (e.g. {"name":"value"}) into type 'Version[]' because the type requires a JSON array (e.g. [1,2,3]) to deserialize correctly.

是否有可能进行这种去罪化?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-06-01 23:45:08

基于评论更新

你的Json看起来不成立。Json需要与“一起使用。例如,

代码语言:javascript
代码运行次数:0
复制
[ "Ford", "BMW", "Fiat" ]

如果允许修改Json,则可以按以下方式修改Json

代码语言:javascript
代码运行次数:0
复制
{
"Foo": 
{
    "Name": "test",
    "versions": [
    {
        "Major": "1",
        "Minor": "1"
    },
    {
        "Major": "2",
        "Minor": "1"
    },
    {
        "Major": "3",
        "Minor": "1"
    }]
}
}

基于您的注释,如果只有一个元素,您希望避免Json数组语法。在其他情况下,您希望坚持数组语法。在这种情况下,您可以编写自定义Json转换器。

代码语言:javascript
代码运行次数:0
复制
class CustomConverter<T> : JsonConverter
{
    public override bool CanConvert(Type objectType)
    {
        return (objectType == typeof(List<T>));
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        JToken token = JToken.Load(reader);
        if (token.Type == JTokenType.Array)
        {
            return token.ToObject<List<T>>().ToArray();
        }
        return new List<T> { token.ToObject<T>() }.ToArray();
    }

    public override bool CanWrite
    {
        get { return false; }
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        throw new NotImplementedException();
    }
}

您可以使用JsonConverter属性来修饰类以使用自定义Json转换器。

代码语言:javascript
代码运行次数:0
复制
class Wrapper
{
    public Foo Foo{get;set;}
}
class Foo
{
  [JsonProperty("Name")]
  public string Name{get;set;}

  [JsonProperty("versions")]
  [JsonConverter(typeof(CustomConverter<Version>))]
  public Version[] versions{get;set;}
}

现在您可以反序列化为

代码语言:javascript
代码运行次数:0
复制
var result =JsonConvert.DeserializeObject<Wrapper>(str);

如果您使用以下任何一个Json定义,现在就可以使用了。

代码语言:javascript
代码运行次数:0
复制
 {
    'Foo': 
    {
        'Name': 'test',
        'versions': [
        {
            'Major': '1',
            'Minor': '1'
        },
        {
            'Major': '2',
            'Minor': '1'
        },
        {
            'Major': '3',
            'Minor': '1'
        }]
    }
    }

单一版本(没有数组语法)

代码语言:javascript
代码运行次数:0
复制
  {
    'Foo': 
    {
        'Name': 'test',
        'versions': 
        {
            'Major': '1',
            'Minor': '1'
        }
    }
    }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56409029

复制
相关文章

相似问题

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