Chuyển đổi bất kỳ loại đối tượng nào thành JObject với Json.NET


89

Tôi thường cần mở rộng mô hình Miền của mình với thông tin bổ sung trước khi trả lại cho khách hàng bằng WebAPI. Để tránh tạo ViewModel, tôi nghĩ rằng tôi có thể trả về JObject với các thuộc tính bổ sung. Tuy nhiên, tôi không thể tìm thấy cách trực tiếp để chuyển đổi đối tượng thuộc bất kỳ loại nào thành JObject chỉ với một lệnh gọi đến thư viện JSON của Newtonsoft. Tôi đã nghĩ ra một cái gì đó như thế này:

  1. SerializeObject đầu tiên
  2. sau đó phân tích cú pháp
  3. và mở rộng JObject

Ví dụ.:

var cycles = cycleSource.AllCycles();

var settings = new JsonSerializerSettings
{
    ContractResolver = new CamelCasePropertyNamesContractResolver()
};

var vm = new JArray();

foreach (var cycle in cycles)
{
    var cycleJson = JObject.Parse(JsonConvert.SerializeObject(cycle, settings));
    // extend cycleJson ......
    vm.Add(cycleJson);
}

return vm;

Tôi cách này đúng?


17
JObject.FromObject(your_domain_object)là những gì bạn đang tìm kiếm. Xem câu trả lời của @ LB.
— Brian Rogers

Câu trả lời:


123

JObject thực hiện IDictionary, vì vậy bạn có thể sử dụng nó theo cách đó. Đối với người yêu cũ,

var cycleJson  = JObject.Parse(@"{""name"":""john""}");

//add surname
cycleJson["surname"] = "doe";

//add a complex object
cycleJson["complexObj"] = JObject.FromObject(new { id = 1, name = "test" });

Vì vậy, json cuối cùng sẽ là

{
  "name": "john",
  "surname": "doe",
  "complexObj": {
    "id": 1,
    "name": "test"
  }
}

Bạn cũng có thể sử dụng dynamictừ khóa

dynamic cycleJson  = JObject.Parse(@"{""name"":""john""}");
cycleJson.surname = "doe";
cycleJson.complexObj = JObject.FromObject(new { id = 1, name = "test" });

Cảm ơn câu trả lời của bạn. Nhưng tôi nhận được json dưới đây khi đánh giá cycleJson, với niềng răng bổ sung. Làm thế nào để tôi có thể tháo mắc cài bổ sung đó ??? {{"name": "john", "surname": "doe", "complexObj": {"id": 1, "name": "test"}}}
— remya thekkuvettil

@remyathekkuvettil nó không phải là json hợp lệ. Bạn cần một số thao tác chuỗi đặc biệt.
— LB

28

Nếu bạn có một đối tượng và muốn trở thành JObject, bạn có thể sử dụng:

JObject o = (JObject)JToken.FromObject(miObjetoEspecial);

như thế này :

Pocion pocionDeVida = new Pocion{
tipo = "vida",
duracion = 32,
};

JObject o = (JObject)JToken.FromObject(pocionDeVida);
Console.WriteLine(o.ToString());
// {"tipo": "vida", "duracion": 32,}

9
Tại sao không trực tiếp JObject.FromObject () thay vì (JObject) JToken.FromObject ()?
— tomexou

nó đã cho tôi mộtSystem.InvalidCastException
— superninja. 13/09/18

1

Điều này sẽ hoạt động:

var cycles = cycleSource.AllCycles();

var settings = new JsonSerializerSettings
{
    ContractResolver = new CamelCasePropertyNamesContractResolver()
};

var vm = new JArray();

foreach (var cycle in cycles)
{
    var cycleJson = JObject.FromObject(cycle);
    // extend cycleJson ......
    vm.Add(cycleJson);
}

return vm;
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookie và Chính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.