JValue
może zawierać tylko proste wartości, takich jak ciągi, wskazówki, logicznych, dat i tym podobne. Nie może zawierać złożonego obiektu. Podejrzewam, że to, co naprawdę chcesz to:
List<User> list = LoadUsers();
JObject json = new JObject();
json["users"] = JToken.FromObject(list);
Powyższy przekonwertuje listę User
obiektów w JArray
z JObjects
reprezentujący użytkowników, a następnie przypisać, że do właściwości users
na nowym JObject
. Możesz to potwierdzić, sprawdzając właściwość Type
pod numerem json["users"]
i sprawdź, czy jest to Array
.
W przeciwieństwie do tego, jeśli zrobisz json["users"] = new JValue(JsonConvert.SerializeObject(list))
, jak zasugerowano w innej odpowiedzi na to pytanie (teraz usunięte), prawdopodobnie nie uzyskasz oczekiwanego wyniku. To podejście spowoduje przekształcenie listy użytkowników w ciąg znaków, utworzenie prostej odmiany JValue
, a następnie przypisanie wartości JValue
do właściwości users
w urządzeniu JObject
. Jeśli przejrzysz właściwość Type
z json["users"]
, zobaczysz, że jest to String
. Oznacza to, że jeśli później spróbujesz przekonwertować JObject
na JSON, używając json.ToString()
, otrzymasz wynik podwójnie serializowany zamiast JSON, którego prawdopodobnie oczekujesz.
Oto krótkie demo, aby zilustrować różnicę:
class Program
{
static void Main(string[] args)
{
List<User> list = new List<User>
{
new User { Id = 1, Username = "john.smith" },
new User { Id = 5, Username = "steve.martin" }
};
JObject json = new JObject();
json["users"] = JToken.FromObject(list);
Console.WriteLine("First approach (" + json["users"].Type + "):");
Console.WriteLine();
Console.WriteLine(json.ToString(Formatting.Indented));
Console.WriteLine();
Console.WriteLine(new string('-', 30));
Console.WriteLine();
json["users"] = new JValue(JsonConvert.SerializeObject(list));
Console.WriteLine("Second approach (" + json["users"].Type + "):");
Console.WriteLine();
Console.WriteLine(json.ToString(Formatting.Indented));
}
class User
{
public int Id { get; set; }
public string Username { get; set; }
}
}
wyjściowa:
First approach (Array):
{
"users": [
{
"Id": 1,
"Username": "john.smith"
},
{
"Id": 5,
"Username": "steve.martin"
}
]
}
------------------------------
Second approach (String):
{
"users": "[{\"Id\":1,\"Username\":\"john.smith\"},{\"Id\":5,\"Username\":\"steve.martin\"}]"
}
pracował dla mnie! Dzięki – s0nica
Dzięki. Właśnie to spędziłem cały dzień próbując dojść do tego. – Trebor
doskonały, dlaczego nie jest to oznaczone jako odpowiedź? – killernerd