Nice programing

루트 이름으로 Json.NET 직렬화 객체

nicepro 2020. 12. 30. 20:23
반응형

루트 이름으로 Json.NET 직렬화 객체


내 웹 앱에서 Newtonsoft.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'
 }
}

익명 객체로 그렇게 할 수 있다는 것을 알고 있지만 Newtonsoft.Json 라이브러리의 속성 또는 다른 방법입니까?


익명 클래스 사용

익명 클래스를 사용하여 원하는 방식으로 모델을 구성하십시오.

var root = new 
{ 
    car = new 
    { 
        name = "Ford", 
        owner = "Henry"
    }
};

string json = JsonConvert.SerializeObject(root);

이것을 렌더링하는 쉬운 방법을 찾았습니다 ... 동적 개체를 선언하고 동적 개체 내의 첫 번째 항목을 컬렉션 클래스로 할당하기 만하면됩니다 ...이 예제에서는 Newtonsoft.Json을 사용하고 있다고 가정합니다.

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();
}

string Json = JsonConvert.SerializeObject(new Car { Name = "Ford", Owner = "John Smith" }, Formatting.None);

루트 요소의 경우 GlobalConfiguration을 사용하십시오.


저에게 매우 간단한 접근 방식은 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; } 
}

직렬화를 수행 할 때 :

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"
    }
  ]
}

도움이 되었기를 바랍니다!


글쎄, 적어도 Json.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"속성 시작 부분에 포함됩니다.

이것은 정확히 당신이 찾고있는 것은 아니지만 비슷한 문제에 직면했을 때 나에게 충분했습니다.


죄송합니다. 제 영어 실력이 그렇게 좋지 않습니다. 그러나 나는 찬성 답변을 개선하는 것을 좋아합니다. 사전을 사용하는 것이 더 간단하고 깨끗하다고 ​​생각합니다.

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
         ]
      ]
   }
}

도움이 되었기를 바랍니다.

//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

반응형