私は彼らの返されたJSONのために次の例の構造を使用するAPIを使用しようとしています
[
{
"customer":{
"first_name":"Test",
"last_name":"Account",
"email":"[email protected]",
"organization":"",
"reference":null,
"id":3545134,
"created_at":"2013-08-06T15:51:15-04:00",
"updated_at":"2013-08-06T15:51:15-04:00",
"address":"",
"address_2":"",
"city":"",
"state":"",
"Zip":"",
"country":"",
"phone":""
}
},
{
"customer":{
"first_name":"Test",
"last_name":"Account2",
"email":"[email protected]",
"organization":"",
"reference":null,
"id":3570462,
"created_at":"2013-08-12T11:54:58-04:00",
"updated_at":"2013-08-12T11:54:58-04:00",
"address":"",
"address_2":"",
"city":"",
"state":"",
"Zip":"",
"country":"",
"phone":""
}
}
]
JSON.netは次のような構造でうまく動作する
{
"customer": {
["field1" : "value", etc...],
["field1" : "value", etc...],
}
}
しかし、私はそれを提供された構造に満足させる方法を理解することはできません。
デフォルトのJsonConvert.DeserializeObject(content)を使用すると、正しい顧客数が得られますが、データはすべてnullです。
以下のCustomerListに対して何かを実行すると、「現在のJSON配列を逆シリアル化できません」という例外が発生します。
public class CustomerList
{
public List<Customer> customer { get; set; }
}
考えですか?
JsonのCustomerJson
を逆シリアル化するための新しいモデルを作成できます。
public class CustomerJson
{
[JsonProperty("customer")]
public Customer Customer { get; set; }
}
public class Customer
{
[JsonProperty("first_name")]
public string Firstname { get; set; }
[JsonProperty("last_name")]
public string Lastname { get; set; }
...
}
そして、あなたは簡単にあなたのJSONを逆シリアル化することができます:
JsonConvert.DeserializeObject<List<CustomerJson>>(json);
それが役に立てば幸い !
ドキュメント: JSONのシリアライズとデシリアライズ
モデルを作成したくない方は、次のコードを使用してください。
var result = JsonConvert.DeserializeObject<
List<Dictionary<string,
Dictionary<string, string>>>>(content);
承認された答えを使うには、Customers[i].customer
を使って各レコードにアクセスしなければならず、余分なCustomerJson
クラスが必要です。これは少し面倒です。そうしたくない場合は、次のようにします。
public class CustomerList
{
[JsonConverter(typeof(MyListConverter))]
public List<Customer> customer { get; set; }
}
ArrayではなくList<>
を使用していることに注意してください。次のクラスを作成しましょう。
class MyListConverter : JsonConverter
{
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
var token = JToken.Load(reader);
var list = Activator.CreateInstance(objectType) as System.Collections.IList;
var itemType = objectType.GenericTypeArguments[0];
foreach (var child in token.Values())
{
var childToken = child.Children().First();
var newObject = Activator.CreateInstance(itemType);
serializer.Populate(childToken.CreateReader(), newObject);
list.Add(newObject);
}
return list;
}
public override bool CanConvert(Type objectType)
{
return objectType.IsGenericType && (objectType.GetGenericTypeDefinition() == typeof(List<>));
}
public override bool CanWrite => false;
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) => throw new NotImplementedException();
}
上記の内容を少し修正しました。私のJsonフォーマットは
{
mycollection:{[
{
property0:value,
property1:value,
},
{
property0:value,
property1:value,
}
]
}
}
AlexDevの返事を使って、私はこのことをしました。
public partial class myModel
{
public static List<myModel> FromJson(string json) => JsonConvert.DeserializeObject<myModelList>(json, Converter.Settings).model;
}
public class myModelList {
[JsonConverter(typeof(myModelConverter))]
public List<myModel> model { get; set; }
}
class myModelConverter : JsonConverter
{
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
var token = JToken.Load(reader);
var list = Activator.CreateInstance(objectType) as System.Collections.IList;
var itemType = objectType.GenericTypeArguments[0];
foreach (var child in token.Children()) //mod here
{
var newObject = Activator.CreateInstance(itemType);
serializer.Populate(child.CreateReader(), newObject); //mod here
list.Add(newObject);
}
return list;
}
public override bool CanConvert(Type objectType)
{
return objectType.IsGenericType && (objectType.GetGenericTypeDefinition() == typeof(List<>));
}
public override bool CanWrite => false;
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) => throw new NotImplementedException();
}