我有这样的代码:
var json = GetJsonData(path);
JObject event_dates_data = JObject.Parse(json);
var event_dates_list = JObject.Parse(event_dates_data["document"]["date"].ToString());
var event_dates = JsonConvert.DeserializeObject<List<EventDate>>(event_dates_list.ToString());
Run Code Online (Sandbox Code Playgroud)
Json 可能包含一个数组对象(例如“date:[{},{},{}]”)或仅包含一个(例如“date:{}”)
Json 看起来像这样:
{
"document": {
"result": "success",
"resultcode": "000000",
"note": null,
"totaldates": "1",
"date": {
"date_id": "351314",
"live": "n",
"datestart": "2012-03-07",
"dateend": "2015-03-07",
"timestart": "12:00",
"timeend": "14:00",
"date_available": "10000"
}
}
}
Run Code Online (Sandbox Code Playgroud)
或者:
{
"document": {
"result": "success",
"resultcode": "000000",
"note": null,
"totaldates": "4",
"date": [
{
"date_id": "346022",
"live": "n",
"datestart": "2011-02-19",
"dateend": "2011-02-19",
"timestart": "12:00",
"timeend": "14:00",
"date_available": "10000" …Run Code Online (Sandbox Code Playgroud) 我有一个基于从第三方 API 获取的非常复杂的 JSON 定义的 C# 对象。这是其中的一部分:
{"alarmSummary":"NONE"}
Run Code Online (Sandbox Code Playgroud)
C# 中对应的属性是:
public string alarmSummary {get; set;}
Run Code Online (Sandbox Code Playgroud)
我将使用 JSON.NET 中的典型 JSONConvert 进行转换:
var alarms = JSONConvert.DeserializeObject<MyClass>(jsonString);
Run Code Online (Sandbox Code Playgroud)
但是,API 将以这种格式将警报作为数组放置,如果没有任何警报作为字符串,则将其放置为“NONE”:
{"alarmSummary" : ["AHHH Something went wrong!!", "I'm on fire!!"]}
Run Code Online (Sandbox Code Playgroud)
这意味着在 C# 中它需要是:
public string[] alarmSummary {get; set;}
Run Code Online (Sandbox Code Playgroud)
如果可以的话,我会让 JSONConvert 将“NONE”字符串反序列化为只有一个条目的数组。有没有办法为此属性设置条件,或者我必须获取整个复杂的 JSON 字符串并手动转换它?
TL;DR:在 json.net 中是否有一种简单的方法来检查属性的类型并基于它创建一个实例?
我在 JSON 中有以下两个对象,它们是JSON API中的关系对象:
{ "data": { "type": "Test", "id": "1" } }
Run Code Online (Sandbox Code Playgroud)
和
{ "data": [{ "type": "Test", "id": "1" }, { "type": "Test", "id": "2" }]}
Run Code Online (Sandbox Code Playgroud)
使用 json.net,我想将这些对象序列化为 ToOneRelation 或 ToManyRelation 类。这些类看起来像这样:
[JsonConverter(typeof(RelationshipConverter))]
abstract class Relation
{
[JsonProperty("meta")]
public Dictionary<string, object> Meta { get; set; }
}
class ToOneRelation : Relation
{
[JsonProperty("data")]
public object Data { get; set; }
}
class ToManyRelation : Relation
{
[JsonProperty("data")]
public List<object> Data { get; …Run Code Online (Sandbox Code Playgroud) 我刚下载了一个包含所有当前MTG集/卡的巨大 JSON文件,我希望将其全部反序列化.
我已经将每个set的大部分反序列化了,但是当我尝试反序列化booster每个Set中的对象时,我遇到了障碍:
从上面两张图片中可以看出,每个booster对象都有一个字符串列表,但是对于某些booster对象,还有一个更多字符串的附加数组.反序列化一个专门的字符串数组不是问题.当我遇到那里是一个字符串数组的情况下,我的问题出现之内的booster需要反序列化对象.
目前我设置的用于处理此反序列化的属性是:
public IEnumerable<string> booster { get; set; }
Run Code Online (Sandbox Code Playgroud)
但是当我遇到其中有另一个数组的情况时,booster我会抛出一个异常,Newtonsoft.Json抱怨它不知道如何处理反序列化.
那么,我的问题就变成了:如何反序列化字符串数组中包含的字符串数组?在C#代码中,对象需要用什么来处理那种反序列化?
我对这个json有以下问题:
{
"EVTS": {
"EVT": [
{ "ID": "123456",
"KEY1" : "somekey",
"CATEG": [
"cat1",
"cat2",
"cat3"
]
}
]}
}
Run Code Online (Sandbox Code Playgroud)
这个c#类:
public class myClass{
public string ID { get; set; }
public string KEY1 { get; set; }
public list<string> CATEG { get; set; }
}
public class ESObject1
{
[JsonProperty("EVT")]
public List<myClass> EVT { get; set; }
}
public class ESObject0
{
[JsonProperty("EVTS")]
public ESObject1 EVTS { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
}
在这里我称之为解串器:
ESObject0 globalobject = JsonConvert.DeserializeObject<ESObject0>(json);
Run Code Online (Sandbox Code Playgroud)
但是这最后一个代码不起作用,我抛出了这个异常: …
我在尝试确定如何使我的序列化能够正确访问单个结果以及数组时遇到困难。
当我进行 REST 调用在服务器上查找某些内容时,有时它会返回模型数组,但如果搜索结果只有一个模型,则不会作为错误返回。这是当我收到无法反序列化的异常时,因为对象属性需要一个数组,但接收的是单个对象。
有没有办法定义我的类,以便它可以在返回时处理类型为 ns1.models 的单个对象而不是对象数组?
[JsonObject]
public class Responses
{
[JsonProperty(PropertyName = "ns1.model")]
public List<Model> Model { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
可反序列化的响应:
{"ns1.model":[
{"@mh":"0x20e800","ns1.attribute":{"@id":"0x1006e","$":"servername"}},
{"@mh":"0x21a400","ns1.attribute":{"@id":"0x1006e","$":"servername2"}}
]}
Run Code Online (Sandbox Code Playgroud)
无法序列化的响应(因为 JSON 仅包含单个“ns1.model”):
{"ns1.model":
{"@mh":"0x20e800","ns1.attribute":{"@id":"0x1006e","$":"servername"}}
}
Run Code Online (Sandbox Code Playgroud)
例外:
Newtonsoft.Json.JsonSerializationException was unhandled HResult=-2146233088 Message=Cannot deserialize the current JSON object (e.g. {"name":"value"}) into type 'System.Collections.Generic.List`1[ConsoleApplication1.Model]' because the type requires a JSON array (e.g. [1,2,3]) to deserialize correctly. To fix this error either change the JSON to a JSON array (e.g. [1,2,3]) or change the deserialized …Run Code Online (Sandbox Code Playgroud) 我正在编写UWP应用程序,并希望将xml中的列表反序列化为Objects列表:
<List>
<Element Name="A">
<SubElement Name="A1">
<Color> Blue </Color>
<Color> Red </Color>
</SubElement>
<SubElement Name="A2">
<Color> Blue </Color>
<Color> Green </Color>
</SubElement>
</Element>
<Element Name="B">
<SubElement Name="B1">
<Color> Yellow </Color>
<Color> Red </Color>
</SubElement>
<SubElement Name="B2">
<Color> Yellow </Color>
<Color> Green </Color>
</SubElement>
</Element>
<Element Name="C"/>
<SubElement Name="C1">
<Color> Purple </Color>
<Color> Red </Color>
</SubElement>
<SubElement Name="C2">
<Color> Purple </Color>
<Color> Green </Color>
</SubElement>
</Element>
</List>
Run Code Online (Sandbox Code Playgroud)
这些类如下所示:
public class Element
{
[XmlAttribute]
public string Name { get; set; }
[XmlElement("SubElement")] …Run Code Online (Sandbox Code Playgroud) 我正在使用 VK API。有时服务器可以返回空数组而不是对象,例如:
\n\npersonal: [] //when it is empty\nRun Code Online (Sandbox Code Playgroud)\n\n或者
\n\npersonal: {\nreligion: \'\xd0\x9d\xd0\xb5\xd1\x82\',\nsmoking: 1,\nalcohol: 4\n} //when not empty.\nRun Code Online (Sandbox Code Playgroud)\n\n我正在使用 JsonConvert.DeserializeObject 反序列化大部分 json,而这部分 json 则使用
\n\nMainObject = ((MainObject["response"].GetObject())["user"].GetObject())["personal"].GetObject();\ntry\n{\nConvert.ToByte(MainObject["political"].GetNumber();\n} \ncatch {}\nRun Code Online (Sandbox Code Playgroud)\n\n但当应用程序处理大量异常时,它会使应用程序运行缓慢。刚才我意识到还有一些字段在为空时可能会返回数组。我只是不知道如何快速而清晰地做到这一点。有什么建议么?
\n\n我的反序列化类(当字段为空时不起作用):
\n\n public class User\n {\n//some other fields...\n public Personal personal { get; set; }\n//some other fields...\n }\n public class Personal\n {\n public byte political { get; set; }\n public string[] langs { get; set; }\n public string religion { get; set; }\n …Run Code Online (Sandbox Code Playgroud) 我必须使用的API在数组中只有一个条目时返回一个对象,否则返回一个正确的数组.这是一个例子:
只有一个条目:
{
"product": {
"offers": {
"id": 1,
"price": 55.6
}
}
}
Run Code Online (Sandbox Code Playgroud)
不止一个条目:
{
"product": {
"offers": [
{
"id": 1,
"price": 55.6
},
{
"id": 2,
"price": 34.6
},
]
}
}
Run Code Online (Sandbox Code Playgroud)
是否有一些方法可以编写代码,将这两个变体反序列化为数组,而无需JsonConverter为整个(深层嵌套)响应编写完整的代码?除了这个奇怪的看似设计决策,JSON.net可以很容易地反序列化它,所以我想知道是否有JSON.net功能允许我写这样的东西:
if (hasExpectedArray && hasEncounteredObject) {
deserialized.property = new List<T>();
deserialized.property.Add(objectEncountered);
}
Run Code Online (Sandbox Code Playgroud)
我的另一个想法是预先解析JSON并使用一些搜索和替换功能来将所有可以是数组的对象更改为数组.但这似乎又脏又脆.
编辑:实际上忘记了第三种情况:它也可以是一个字符串或其中一个数组成员可以是一个字符串:
{
"product": {
"offers": "This is an offer"
}
}
{
"product": {
"offers": [
{
"id": 1,
"price": 55.6
},
"This is another offer"
]
}
}
Run Code Online (Sandbox Code Playgroud) 我想分析Telegram-Chats,所以我以JSON格式导出了聊天,并想将其反序列化到我的分析软件中。
{
"id": 397910,
"type": "message",
"date": "2018-02-21T10:27:59",
"edited": "1970-01-01T01:00:00",
"from": "Username",
"from_id": 39033284,
"text": "Some Text"
}
Run Code Online (Sandbox Code Playgroud)
所以我用这个简单的代码来读取JSON
List<JSONObject> jsonObjects = JsonConvert.DeserializeObject<List<JSONObject>>(File.ReadAllText(openFileDialog.FileName));
public class JSONObject
{
public int ID;
public string type;
public string date;
public string edited;
public string from;
public int fromID;
public string photo;
public int width;
public int height;
public string text;
}
Run Code Online (Sandbox Code Playgroud)
对于前525个数据集来说,这非常顺利,但是之后,由于“一致性问题”,我难以对数据进行反序列化。文本的数据类型有时会更改为数组。
{
"id": 397911,
"type": "message",
"date": "2018-02-21T10:31:47",
"edited": "1970-01-01T01:00:00",
"from": "Username",
"from_id": 272964614,
"text": [
"Some Text ",
{
"type": "mention", …Run Code Online (Sandbox Code Playgroud)