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

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

Stack Overflow用户
提问于 2019-06-01 09: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 15: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

复制
相关文章
如何更改Json.NET的序列化规则
我想要使序列化出来的JSON都是小写,可以通过建立 LowercaseContractResolver:DefaultContractResolver
javascript.shop
2019/09/04
1.3K0
在MVC中使用Json.Net序列化和反序列化Json对象
在.Net的MVC开发中,经常会使用到Json对象,于是,系统提供了JsonResult这个对象,其本质是调用.Net系统自带的Json序列化类JavaScriptSerializer对数据对象进行序列化。但是这个系统自带的Json序列化对象方法没有Json.Net好用,于是打算有些时候用Json.Net替代默认的实现。
深蓝studyzy
2022/06/16
1.2K0
[C#] .NET原生类库封装Json序例化
Json【javascript对象表示方法】,它是一个轻量级的数据交换格式,我们可以很简单的来读取和写它,并且它很容易被计算机转化和生成,它是完全独立于语言的。
科控物联
2022/03/29
2K0
[C#] .NET原生类库封装Json序例化
Json.Net6.0入门学习试水篇
  JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。简单地说,JSON 可以将 JavaScript 对象中表示的一组数据转换为字符串,然后就可以在函数之间轻松地传递这个字符串,或者在异步应用程序中将字符串从 Web 客户机传递给服务器端程序。这个字符串看起来有点儿古怪,但是 JavaScript 很容易解释它,而且 JSON 可以表示比"名称 / 值对"更复杂的结构。例如,可以表示数组和复杂的对象,而不仅仅是键和值的简单列表。
aehyok
2018/08/31
1.5K0
Json.Net6.0入门学习试水篇
Kafka 是否可以用做长期数据存储?
问题 “把 Kafka 作为长期存储有问题吗?” 这是一个非常常见的问题,我们知道,Kafka 是这样存储日志记录的 答案是“可以”,只要把数据保留时间设置为“永久”,或者开启日志压缩,数据就会被一直
dys
2018/04/04
3.2K0
Kafka 是否可以用做长期数据存储?
Json.NET 3.0
Json.NET,提供相当完整的文档之外,还提供了 LINQ to JSON 的 LINQ Provider 可以更方便的读取JSON 对象,今后将可比以往用更轻松的方式用 .NET编写 JSON 相关的程序了,Json.NET有下列特色: 支持 LINQ to JSON 支持Silverlight :Json.NET 提供一个 Newtonsoft.Json.Silverlight.dll  组件,可供 Silverlight 项目加入引用使用 快速的 JsonReader 与 JsonWriter
张善友
2018/01/29
8180
【C++】内联函数 ① ( 内联函数引入 | 内联函数语法 )
" 内联函数 " 是 C++ 语言中的一种特殊函数 , 其目的是为了提高程序的执行效率 ;
韩曙亮
2023/10/15
2300
【C++】内联函数 ① ( 内联函数引入 | 内联函数语法 )
js检查是否是数组
该方法兼容Chrome 5, Firefox 4.0, IE 9, Opera 10.5 和 Safari 5,详细兼容性,可以查阅这篇文章。
IT工作者
2022/01/27
3.4K0
【C++】内联函数 ⑤ ( 内联函数总结 | 内联函数代码示例 )
调用 int c = fun1(++a, b); 代码 , fun1 是 普通函数 ;
韩曙亮
2023/10/15
3990
【C++】内联函数 ⑤ ( 内联函数总结 | 内联函数代码示例 )
Newtonsoft.Json高级用法
本文介绍了Newtonsoft.Json在.NET框架中的序列化用法,包括数组、List、字典、集合、枚举、Nullable类型、自定义转换、跨语言特性、序列化筛选器和性能优化等。
用户1168362
2018/01/05
3.1K0
Newtonsoft.Json高级用法
如何判断某个产品,是否可以用SEO带货?
我们建立SEO你问我答社群有一段时间,在群里我们每天都会收到各种SEO问题,比如:有人讲“建盏”这个产品是否可以用SEO的方式去建立网站,然后进行带货销售。
数据通20847430
2020/03/09
4430
Asp.Net Web API 2第十三课——ASP.NET Web API中的JSON和XML序列化
阅读本文之前,您也可以到Asp.Net Web API 2 系列导航进行查看 http://www.cnblogs.com/aehyok/p/3446289.html
aehyok
2018/08/31
2.1K0
MySQL 判断 JSON 数组是否相等
JSON(JavaScript Object Notation)是流行的互联网应用服务之间的数据交换格式。
恋喵大鲤鱼
2023/10/12
4350
js -- 判断数组是否为空?
上面三种判断数组为空的方法虽然大多数情况下都可以用,但依然存在bug,比如令arr[-1] = ''时,数组不为空,但三者都返回true。
小蔚
2020/09/07
20.5K0
java中判断是否为数组[通俗易懂]
大家好,我是架构君,一个会写代码吟诗的架构师。今天说一说java中判断是否为数组,希望能够帮助大家进步!!!
Java架构师必看
2022/01/17
4.8K0
java中判断是否为数组[通俗易懂]
python 内联函数
python的一些小函数很能提高效率,平时在工作中经常忽视这些内容,而使用很原始粗暴的方法写代码;写了一段时间以后,发现自己的提高很少,要写个小脚本也要纠结半天,跟那些大拿们相差太大;所以要检讨自己,看看自己可以从那方面提高自己的技术能力;
py3study
2020/01/06
2K0
Markdown 如何在内联代码或者代码块中使用代码开始符号反引号(`)
我们都知道如何在 Markdown 中使用反引号 ` 来包裹一段代码。无论是内联的代码还是单独的代码块,都需要使用它,只是个数的差别,比如 ` 和 ```。
walterlv
2023/10/22
6790
CSS 块元素、内联元素、内联块元素
元素就是标签,布局中常用的有三种标签,块元素、内联元素、内联块元素,了解这三种元素的特性,才能熟练的进行页面布局。
Devops海洋的渔夫
2019/05/31
3.9K0
inline内联函数
  inline 说明这个函数是内联的,在编译过程中内联函数会直接被源代码替换, 提高执行效率 如果类中的某个函数会被调用很多次或者放在循环中, 那么建议将这个函数声明为内联,可以提高程序的运行效率,例如下面代码: inline double Dis(Node a,Node b) { return sqrt(1LL*(a.x-b.x)*(a.x-b.x)+1LL*(a.y-b.y)*(a.y-b.y)); } inline void GetAns() { double Ans=0
用户2965768
2018/08/30
8190
图像分类比赛中,你可以用如下方案举一反三
雷锋网 AI 研习社按,在本文中,作者将向大家介绍其在 Kaggle 植物幼苗分类大赛(https://www.kaggle.com/c/plant-seedlings-classification)中所使用的解决方案。本文作者曾经位列该项赛事排行榜榜首达数月之久,并最终斩获第五名。作者使用的方法普适性非常强,可以用于其它的图像识别任务。雷锋网(公众号:雷锋网) AI 研习社将原文编译整理如下。
AI研习社
2018/07/26
9460
图像分类比赛中,你可以用如下方案举一反三

相似问题

JSON.NET序列化为数组

12

Json.NET可以用格式序列化为流吗?

10

JSON.net反序列化数组数组

11

使用json.net反序列化时是否保留数组顺序?

24

Json.net读取序列化数组

113
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文