J'utilise FOR JSON de SQL Server 2016 pour convertir une instruction SQL Server SELECT en une chaîne JSON. Mon intention est que C# convertisse la chaîne JSON produite en un objet.Comment convertir une structure JSON enfant en un graphique d'objet C#
serveur SQL Server instruction select:
SELECT
Id AS PersonId,
FirstName,
LastName,
Name,
Birthday,
(
SELECT
PhoneNumber.PhoneNumberTypeId,
PhoneNumber.PhoneNumber
FROM
PhoneNumber
INNER JOIN PhoneNumberType ON PhoneNumber.PhoneNumberTypeId = PhoneNumberType.Id
WHERE
PhoneNumber.PersonId = Person.Id
FOR JSON PATH,INCLUDE_NULL_VALUES
) AS PhoneNumberList
FROM
Person
ORDER BY
LastName
FOR JSON PATH,INCLUDE_NULL_VALUES
C# Object Je suis en train de convertir les données en:
public class PersonDataContract : IPersonDataContract
{
public Int32 PersonId { get; set; }
public String FirstName { get; set; }
public String LastName { get; set; }
public String Name { get; set; }
public DateTime? Birthday { get; set; }
public Int32 Age { get; }
public IList<IPhoneNumberDataContract> PhoneNumberList { get; set; }
public PersonDataContract()
{
PhoneNumberList = new List<IPhoneNumberDataContract>();
}
}
Raw JSON:
[
{
"PersonId": 5,
"FirstName": "Squire",
"LastName": "Escrow",
"Name": "Squire Escrow",
"Birthday": "2001-12-12",
"PhoneNumberList": "[{\"PhoneNumberTypeId\":1,\"PhoneNumber\":\"8129091423\"}]"
},
{
"PersonId": 6,
"FirstName": "Vilhelm",
"LastName": "Huldsputh",
"Name": "Vilhelm Huldsputh",
"Birthday": "1953-11-13",
"PhoneNumberList": "[{\"PhoneNumberTypeId\":1,\"PhoneNumber\":\"9871237171\"},{\"PhoneNumberTypeId\":2,\"PhoneNumber\":\"8189991212\"}]"
}
]
conversion de code JSON brut à l'objet:
...
using (DbDataReader reader = command.ExecuteReader(CommandBehavior.CloseConnection))
{
while (reader.Read())
{
var jsonString = reader.GetValue(0).ToString();
var list = JsonConvert.DeserializeObject<List<PersonDataContract>>(jsonString);
}
reader.Close();
}
Ce processus fonctionne aussi longtemps que je retire PhoneNumberList de la JSON brut. Je pense que le problème est que j'utilise 2 'FOR JSON PATH dans mon instruction SQL (une pour la PhoneNumberList elle-même et une pour l'instruction SELECT globale) qui provoque la conversion de PhoneNumberList en String qui n'est pas converti en un tableau. Comment convertir la chaîne enfant représentant une collection de numéros de téléphone en un tableau de IPhoneNumberDataContrat?
'... Anniversaire, JSON_QUERY (SELECT ...)'. –
Marquez PhoneNumberList de PersonDataContract en tant que chaîne, puis désérialisez chacune de ces chaînes en PhoneNumberDataContract. –
@JeroenMostert - votre suggestion a résolu le problème. Pouvez-vous répondre à la question s'il vous plaît afin que je puisse l'accepter. Je vous remercie. –