루트 이름을 사용하여 Json.NET 개체를 직렬화합니다.
내 웹 앱에서 나는 뉴턴소프트를 사용하고 있다.Json과 나는 다음과 같은 목적을 가지고 있다.
[Newtonsoft.Json.JsonObject(Title = "MyCar")]
public class Car
{
[Newtonsoft.Json.JsonProperty(PropertyName = "name")]
public string Name{get;set;}
[Newtonsoft.Json.JsonProperty(PropertyName = "owner")]
public string Owner{get;set;}
}
루트명(클래스명)으로 시리얼화해 주세요.이 형식은 다음을 사용하여 사용하는 것이 좋습니다.
{'MyCar':
{
'name': 'Ford',
'owner': 'John Smith'
}
}
익명의 오브젝트로도 할 수 있다는 것은 알지만 뉴턴소프트에서는 어떤 특성이나 다른 방법이든 상관없습니다.Json 라이브러리?
익명 클래스 사용
익명 클래스를 사용하여 원하는 방식으로 모델을 쉐이핑할 수 있습니다.
var root = new
{
car = new
{
name = "Ford",
owner = "Henry"
}
};
string json = JsonConvert.SerializeObject(root);
이걸 쉽게 풀 수 있는 방법을 찾았어요동적 개체를 선언하고 동적 개체 내의 첫 번째 항목을 컬렉션 클래스로 할당하기만 하면 됩니다.이 예에서는 Newtonsoft를 사용하고 있다고 가정하고 있습니다.제이슨
private class YourModelClass
{
public string firstName { get; set; }
public string lastName { get; set; }
}
var collection = new List<YourModelClass>();
var collectionWrapper = new {
myRoot = collection
};
var output = JsonConvert.SerializeObject(collectionWrapper);
결론은 다음과 같습니다.
{"myRoot":[{"firstName":"John", "lastName": "Citizen"}, {...}]}
독자적인 시리얼 라이저를 간단하게 작성할 수 있습니다.
var car = new Car() { Name = "Ford", Owner = "John Smith" };
string json = Serialize(car);
string Serialize<T>(T o)
{
var attr = o.GetType().GetCustomAttribute(typeof(JsonObjectAttribute)) as JsonObjectAttribute;
var jv = JValue.FromObject(o);
return new JObject(new JProperty(attr.Title, jv)).ToString();
}
미안해요, 제가 영어를 잘 못해요.하지만 나는 상향식 답변을 개선하고 싶다.나는 사전을 사용하는 것이 더 간단하고 깨끗하다고 생각한다.
class Program
{
static void Main(string[] args)
{
agencia ag1 = new agencia()
{
name = "Iquique",
data = new object[] { new object[] {"Lucas", 20 }, new object[] {"Fernando", 15 } }
};
agencia ag2 = new agencia()
{
name = "Valparaiso",
data = new object[] { new object[] { "Rems", 20 }, new object[] { "Perex", 15 } }
};
agencia agn = new agencia()
{
name = "Santiago",
data = new object[] { new object[] { "Jhon", 20 }, new object[] { "Karma", 15 } }
};
Dictionary<string, agencia> dic = new Dictionary<string, agencia>
{
{ "Iquique", ag1 },
{ "Valparaiso", ag2 },
{ "Santiago", agn }
};
string da = Newtonsoft.Json.JsonConvert.SerializeObject(dic);
Console.WriteLine(da);
Console.ReadLine();
}
}
public class agencia
{
public string name { get; set; }
public object[] data { get; set; }
}
이 코드는 다음 json을 생성합니다(이 형식은 원하는 형식입니다).
{
"Iquique":{
"name":"Iquique",
"data":[
[
"Lucas",
20
],
[
"Fernando",
15
]
]
},
"Valparaiso":{
"name":"Valparaiso",
"data":[
[
"Rems",
20
],
[
"Perex",
15
]
]
},
"Santiago":{
"name":"Santiago",
"data":[
[
"Jhon",
20
],
[
"Karma",
15
]
]
}
}
string Json = JsonConvert.SerializeObject(new Car { Name = "Ford", Owner = "John Smith" }, Formatting.None);
root 요소의 경우 Global Configuration을 사용합니다.
저에게 매우 간단한 방법은 2개의 클래스를 만드는 것입니다.
public class ClassB
{
public string id{ get; set; }
public string name{ get; set; }
public int status { get; set; }
public DateTime? updated_at { get; set; }
}
public class ClassAList
{
public IList<ClassB> root_name{ get; set; }
}
또, 시리얼라이제이션(serialization)을 실행하는 경우는, 다음과 같습니다.
var classAList = new ClassAList();
//...
//assign some value
//...
var jsonString = JsonConvert.SerializeObject(classAList)
마지막으로 원하는 결과는 다음과 같습니다.
{
"root_name": [
{
"id": "1001",
"name": "1000001",
"status": 1010,
"updated_at": "2016-09-28 16:10:48"
},
{
"id": "1002",
"name": "1000002",
"status": 1050,
"updated_at": "2016-09-28 16:55:55"
}
]
}
이게 도움이 됐으면 좋겠네요!
적어도 제이슨에게 말 할 수는 있잖아NET : 유형명 http://www.newtonsoft.com/json/help/html/T_Newtonsoft_Json_TypeNameHandling.htm 을 포함합니다.Newtonsoft.Json.JsonSerializer jser = new Newtonsoft.Json.JsonSerializer(); jser.TypeNameHandling = TypeNameHandling.Objects;
유형은 개체의 "$type" 속성의 시작 부분에 포함됩니다.
이것은 당신이 찾고 있는 것은 아니지만, 저는 비슷한 문제에 직면했을 때 충분히 도움이 되었습니다.
커스텀 Json Converter를 작성하는 것도 비슷한 질문에서 언급된 다른 방법입니다.하지만, 그 특성상JsonConverter이 질문에 대해 이 접근방식을 사용하는 것은 매우 까다롭습니다.이것에 주의할 필요가 있습니다.WriteJson무한 재귀 방지를 위한 구현: JSON.Net이 StackOverflow를 슬로우하다[JsonConvert()]를 사용하는 경우 예외입니다.
1가지 가능한 구현:
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
//JToken t = JToken.FromObject(value); // do not use this! leads to stack overflow
JsonObjectContract contract = (JsonObjectContract)serializer.ContractResolver.ResolveContract(value.GetType());
writer.WriteStartObject();
writer.WritePropertyName(value.GetType().Name);
writer.WriteStartObject();
foreach (var property in contract.Properties)
{
// this removes any property with null value
var propertyValue = property.ValueProvider.GetValue(value);
if (propertyValue == null) continue;
writer.WritePropertyName(property.PropertyName);
serializer.Serialize(writer, propertyValue);
//writer.WriteValue(JsonConvert.SerializeObject(property.ValueProvider.GetValue(value))); // this adds escaped quotes
}
writer.WriteEndObject();
writer.WriteEndObject();
}
이게 도움이 됐으면 좋겠어요.
//Sample of Data Contract:
[DataContract(Name="customer")]
internal class Customer {
[DataMember(Name="email")] internal string Email { get; set; }
[DataMember(Name="name")] internal string Name { get; set; }
}
//This is an extension method useful for your case:
public static string JsonSerialize<T>(this T o)
{
MemoryStream jsonStream = new MemoryStream();
var serializer = new System.Runtime.Serialization.Json.DataContractJsonSerializer(typeof(T));
serializer.WriteObject(jsonStream, o);
var jsonString = System.Text.Encoding.ASCII.GetString(jsonStream.ToArray());
var props = o.GetType().GetCustomAttributes(false);
var rootName = string.Empty;
foreach (var prop in props)
{
if (!(prop is DataContractAttribute)) continue;
rootName = ((DataContractAttribute)prop).Name;
break;
}
jsonStream.Close();
jsonStream.Dispose();
if (!string.IsNullOrEmpty(rootName)) jsonString = string.Format("{{ \"{0}\": {1} }}", rootName, jsonString);
return jsonString;
}
//Sample of usage
var customer = new customer {
Name="John",
Email="john@domain.com"
};
var serializedObject = customer.JsonSerialize();
[Newtonsoft.Json.JsonObject(Title = "root")]
public class TestMain
코드를 작동시키기 위해 추가할 필요가 있는 유일한 속성입니다.
언급URL : https://stackoverflow.com/questions/16294963/json-net-serialize-object-with-root-name
'programing' 카테고리의 다른 글
| Unix 툴을 사용한JSON 해석 (0) | 2023.02.12 |
|---|---|
| 워드프레스 비주얼 에디터가 줄 바꿈을 만들지 않음 (0) | 2023.02.12 |
| ngRoute 모든 루트의 set base URL (0) | 2023.02.12 |
| Json.net을 사용하여 복합 키를 사용하여 사전을 직렬화할 수 없습니다. (0) | 2023.02.12 |
| MongoDB 접속의 .NET 베스트 프랙티스 (0) | 2023.02.12 |