如何将一组 JSON 个对象转换为 C# 列表
How to Convert a Set of JSON Objects to C# List
我有一个 JSON 文件,看起来像这样:
{
"foo": "bar",
"pets": {
"dog": {
"name": "spot",
"age": "3"
},
"cat": {
"name": "wendy",
"age": "2"
}
}
}
我想将其反序列化为 C# class:
public class PetObject
{
[JsonProperty("name")]
public string Name { get; set; }
[JsonProperty("age")]
public string Age { get; set; }
}
public class FooObject
{
[JsonProperty("foo")]
public string Foo { get; set; }
[JsonProperty("pets")]
public List<PetObject> Pets { get; set; }
}
使用这样的代码进行转换是行不通的,因为 pets 内部有多个对象,并且不是 JSON 数组。
//does not work
FooObject content = JsonConvert.DeserializeObject<FooObject>(json);
这是例外情况:
Newtonsoft.Json.JsonSerializationException
HResult=0x80131500
Message=Cannot deserialize the current JSON object (e.g. {"name":"value"}) into type 'System.Collections.Generic.List`1[Test.PetObject]' 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 type so that it is a normal .NET type (e.g. not a primitive type like integer, not a collection type like an array or List<T>) that can be deserialized from a JSON object. JsonObjectAttribute can also be added to the type to force it to deserialize from a JSON object.
Path 'pets.dog', line 4, position 10.
有没有办法把pets对象里面的对象转换成对象数组? (除了在将 JSON 传递给 DeserializeObject 方法之前编辑它本身)
你的 json
而不是 说 "array of objects"。它说它有一个具有 dog
和 cat
属性的 pets
对象。所以像这样:
public class PetObject
{
public string name { get; set; }
public string age { get; set; }
}
public class Foo
{
public string foo { get; set; }
public Pets pets {get;set;}
}
public class Pets
{
public PetObject dog { get; set; }
public PetObject cat { get; set;}
}
public class Program
{
public static void Main()
{
var json = "{\"foo\": \"bar\",\"pets\": {\"dog\": {\"name\": \"spot\",\"age\": \"3\"},\"cat\": {\"name\": \"wendy\",\"age\": \"2\"}}}";
var content = JsonConvert.DeserializeObject<Foo>(json);
Console.WriteLine(content.pets.dog.name);
}
}
第...
这里的结构很糟糕 json。但是,您可以使用 JsonProperty
属性反序列化它,如下所示:
class Program
{
static void Main(string[] args)
{
string json = "{\"foo\": \"bar\",\"pets\": {\"dog\": {\"name\": \"spot\",\"age\": \"3\"},\"cat\": {\"name\": \"wendy\",\"age\": \"2\"}}}";
Foo content = JsonConvert.DeserializeObject<Foo>(json);
Console.Read();
}
}
public class PetObject
{
[JsonProperty("name")]
public string Name { get; set; }
[JsonProperty("age")]
public string Age { get; set; }
}
public class Foo
{
[JsonProperty("foo")]
public string FooStr { get; set; }
[JsonProperty("pets")]
public Dictionary<string, PetObject> Pets { get; set; }
}
您的 JSON 文件包含宠物字典,而不是数组。所以,改变 FooObject
class:
public class FooObject
{
[JsonProperty("foo")]
public string Foo { get; set; }
[JsonProperty("pets")]
public Dictionary<string, PetObject> Pets { get; set; }
// if you still need a list of pets, use this
public List<PetObject> PetsList => Pets.Values.ToList();
}
我有一个 JSON 文件,看起来像这样:
{
"foo": "bar",
"pets": {
"dog": {
"name": "spot",
"age": "3"
},
"cat": {
"name": "wendy",
"age": "2"
}
}
}
我想将其反序列化为 C# class:
public class PetObject
{
[JsonProperty("name")]
public string Name { get; set; }
[JsonProperty("age")]
public string Age { get; set; }
}
public class FooObject
{
[JsonProperty("foo")]
public string Foo { get; set; }
[JsonProperty("pets")]
public List<PetObject> Pets { get; set; }
}
使用这样的代码进行转换是行不通的,因为 pets 内部有多个对象,并且不是 JSON 数组。
//does not work
FooObject content = JsonConvert.DeserializeObject<FooObject>(json);
这是例外情况:
Newtonsoft.Json.JsonSerializationException
HResult=0x80131500
Message=Cannot deserialize the current JSON object (e.g. {"name":"value"}) into type 'System.Collections.Generic.List`1[Test.PetObject]' 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 type so that it is a normal .NET type (e.g. not a primitive type like integer, not a collection type like an array or List<T>) that can be deserialized from a JSON object. JsonObjectAttribute can also be added to the type to force it to deserialize from a JSON object.
Path 'pets.dog', line 4, position 10.
有没有办法把pets对象里面的对象转换成对象数组? (除了在将 JSON 传递给 DeserializeObject 方法之前编辑它本身)
你的 json
而不是 说 "array of objects"。它说它有一个具有 dog
和 cat
属性的 pets
对象。所以像这样:
public class PetObject
{
public string name { get; set; }
public string age { get; set; }
}
public class Foo
{
public string foo { get; set; }
public Pets pets {get;set;}
}
public class Pets
{
public PetObject dog { get; set; }
public PetObject cat { get; set;}
}
public class Program
{
public static void Main()
{
var json = "{\"foo\": \"bar\",\"pets\": {\"dog\": {\"name\": \"spot\",\"age\": \"3\"},\"cat\": {\"name\": \"wendy\",\"age\": \"2\"}}}";
var content = JsonConvert.DeserializeObject<Foo>(json);
Console.WriteLine(content.pets.dog.name);
}
}
第...
这里的结构很糟糕 json。但是,您可以使用 JsonProperty
属性反序列化它,如下所示:
class Program
{
static void Main(string[] args)
{
string json = "{\"foo\": \"bar\",\"pets\": {\"dog\": {\"name\": \"spot\",\"age\": \"3\"},\"cat\": {\"name\": \"wendy\",\"age\": \"2\"}}}";
Foo content = JsonConvert.DeserializeObject<Foo>(json);
Console.Read();
}
}
public class PetObject
{
[JsonProperty("name")]
public string Name { get; set; }
[JsonProperty("age")]
public string Age { get; set; }
}
public class Foo
{
[JsonProperty("foo")]
public string FooStr { get; set; }
[JsonProperty("pets")]
public Dictionary<string, PetObject> Pets { get; set; }
}
您的 JSON 文件包含宠物字典,而不是数组。所以,改变 FooObject
class:
public class FooObject
{
[JsonProperty("foo")]
public string Foo { get; set; }
[JsonProperty("pets")]
public Dictionary<string, PetObject> Pets { get; set; }
// if you still need a list of pets, use this
public List<PetObject> PetsList => Pets.Values.ToList();
}