Tạo JSON nhanh chóng với JObject


95

Đối với một số bài kiểm tra đơn vị của tôi, tôi muốn khả năng xây dựng các giá trị JSON cụ thể (trong trường hợp này là album ghi lại) có thể được sử dụng làm đầu vào cho hệ thống đang kiểm tra.

Tôi có mã sau:

var jsonObject = new JObject();
jsonObject.Add("Date", DateTime.Now);
jsonObject.Add("Album", "Me Against The World");
jsonObject.Add("Year", 1995);
jsonObject.Add("Artist", "2Pac");

Điều này hoạt động tốt, nhưng tôi chưa bao giờ thực sự thích cú pháp "chuỗi ma thuật" và muốn một cái gì đó gần hơn với cú pháp thuộc tính mở rộng trong JavaScript như thế này:

jsonObject.Date = DateTime.Now;
jsonObject.Album = "Me Against The World";
jsonObject.Year = 1995;
jsonObject.Artist = "2Pac";

5
Bạn sẽ nhận được gấp đôi điểm cho lựa chọn nghệ sĩ / album!
spottedmahn

Câu trả lời:


142

Chà, thế còn:

dynamic jsonObject = new JObject();
jsonObject.Date = DateTime.Now;
jsonObject.Album = "Me Against the world";
jsonObject.Year = 1995;
jsonObject.Artist = "2Pac";

3
Hoàn hảo! Chính xác những gì tôi đang tìm kiếm, hoàn toàn quên mất dynamic.
Karl Anderson

Tôi nhận được 'Newtonsoft.Json.Linq.JObject' không chứa định nghĩa cho lỗi 'Ngày' khi tôi cố gắng chạy mã của bạn. Cách tôi có thể làm cho nó hoạt động là thay đổi dòng đầu tiên thành: dynamic jsonExpando = new ExpandoObject();và thêm một dòng sau mã của bạn:JObject jsonObject = JObject.FromObject(jsonExpando);
BornToCode

3
Nếu bạn muốn thêm một Danh sách <> vào đối tượng Json của mình, bạn cần phải làm như sau jsonObject.list = JToken.FromObject(mylist);.
Steve Smith

Bạn có thể sử dụng kết hợp chỉ mục và ký hiệu thuộc tính trong trường hợp bạn nhấn vào tên trường có ký tự đặc biệt, ví dụ: Create-Year ". Bạn sẽ không thể viết jsonObject.Create-Year = 1995, nhưng có thể sử dụng sau. JsonObject [" Create-Year "] = 1995; jsonObject.Artist =" 2Pac ";
PAS

71

Bạn có thể sử dụng JObject.Parsethao tác và chỉ cần cung cấp văn bản JSON được phân tách bằng dấu ngoặc kép.

JObject  o = JObject.Parse(@"{
  'CPU': 'Intel',
  'Drives': [
    'DVD read/writer',
    '500 gigabyte hard drive'
  ]
}");

Điều này có lợi ích tốt khi thực sự là JSON và vì vậy nó được đọc là JSON.

Hoặc bạn có dữ liệu thử nghiệm động, bạn có thể sử dụng JObject.FromObjecthoạt động và cung cấp một đối tượng nội tuyến.

JObject o = JObject.FromObject(new
{
    channel = new
    {
        title = "James Newton-King",
        link = "http://james.newtonking.com",
        description = "James Newton-King's blog.",
        item =
            from p in posts
            orderby p.Title
            select new
            {
                title = p.Title,
                description = p.Description,
                link = p.Link,
                category = p.Categories
            }
    }
});

Tài liệu Json.net để tuần tự hóa


10
JObject.FromObject nên được đánh dấu là câu trả lời đúng. Cảm ơn.
Thomas

1
Tôi nghĩ JObject.FromObjectsẽ không hoạt động nếu có các thuộc tính với các ký tự đặc biệt như -.
Jatin Sanghvi

39

Cả dynamichoặc JObject.FromObjectgiải pháp đều không hoạt động khi bạn có các thuộc tính JSON không phải là tên biến C # hợp lệ, ví dụ "@odata.etag". Tôi thích cú pháp của trình khởi tạo chỉ mục trong các trường hợp thử nghiệm của mình:

JObject jsonObject = new JObject
{
    ["Date"] = DateTime.Now,
    ["Album"] = "Me Against The World",
    ["Year"] = 1995,
    ["Artist"] = "2Pac"
};

Việc có tập hợp các ký hiệu bao quanh riêng biệt để khởi tạo JObjectvà thêm thuộc tính vào nó làm cho các bộ khởi tạo chỉ mục dễ đọc hơn các bộ khởi tạo đối tượng cổ điển, đặc biệt là trong trường hợp các đối tượng JSON kết hợp như bên dưới:

JObject jsonObject = new JObject
{
    ["Date"] = DateTime.Now,
    ["Album"] = "Me Against The World",
    ["Year"] = 1995,
    ["Artist"] = new JObject
    {
        ["Name"] = "2Pac",
        ["Age"] = 28
    }
};

Với cú pháp khởi tạo đối tượng, cách khởi tạo trên sẽ là:

JObject jsonObject = new JObject
{
    { "Date", DateTime.Now },
    { "Album", "Me Against The World" },
    { "Year", 1995 }, 
    { "Artist", new JObject
        {
            { "Name", "2Pac" },
            { "Age", 28 }
        }
    }
};

2
Cái cuối cùng chắc chắn là cú pháp tốt nhất để viết json trong c #.
Anthony Brenelière

xem stackoverflow.com/questions/51015036/… để biết cách thực hiện việc này với các bộ sưu tập
kofifus

30

Có một số môi trường mà bạn không thể sử dụng động (ví dụ: Xamarin.iOS) hoặc các trường hợp trong đó bạn chỉ tìm kiếm một giải pháp thay thế cho các câu trả lời hợp lệ trước đó.

Trong những trường hợp này, bạn có thể làm:

using Newtonsoft.Json.Linq;

JObject jsonObject =
     new JObject(
             new JProperty("Date", DateTime.Now),
             new JProperty("Album", "Me Against The World"),
             new JProperty("Year", "James 2Pac-King's blog."),
             new JProperty("Artist", "2Pac")
         )

Tài liệu khác tại đây: http://www.newtonsoft.com/json/help/html/CreatingLINQtoJSON.htm


2

Cách đơn giản để tạo newtonsoft JObject từ Properties.

Đây là thuộc tính người dùng mẫu

public class User
{
    public string Name;
    public string MobileNo;
    public string Address;
}

và tôi muốn thuộc tính này trong newtonsoft JObject là:

JObject obj = JObject.FromObject(new User()
{
    Name = "Manjunath",
    MobileNo = "9876543210",
    Address = "Mumbai, Maharashtra, India",
});

Đầu ra sẽ như thế này:

{"Name":"Manjunath","MobileNo":"9876543210","Address":"Mumbai, Maharashtra, India"}

2

Sớm muộn gì bạn cũng sẽ có tài sản với ký tự đặc biệt. Bạn có thể sử dụng chỉ mục hoặc kết hợp chỉ mục và thuộc tính.

dynamic jsonObject = new JObject();
jsonObject["Create-Date"] = DateTime.Now; //<-Index use
jsonObject.Album = "Me Against the world"; //<- Property use
jsonObject["Create-Year"] = 1995; //<-Index use
jsonObject.Artist = "2Pac"; //<-Property use

Làm thế nào để trả lời câu hỏi này?
Enigmativity vào

@Enigmativity, Điểm tôi đang đưa ra là bạn có thể sử dụng ký hiệu chỉ mục và ký hiệu thuộc tính cùng nhau. tức là obj [x] = x1; obj.y = y1 có thể được sử dụng trong cùng một đoạn mã. Sự kết hợp của từ khóa động và ký hiệu chỉ mục trả lời các câu hỏi. Không có câu trả lời nào khác đề cập đến điều này. Có thể, đây nên là một bình luận hơn là một câu trả lời.
PAS

Tôi chỉ nghĩ rằng câu hỏi là về việc không sử dụng dây ma thuật, nhưng câu trả lời này mang lại cho anh ta điều đó.
Enigmativity vào

@Enigmativity, từ khóa động chỉ đánh lừa trình biên dịch. Vì vậy, nó không khác gì chuỗi tùy ý. đối tượng kiểu dynmaic không được gõ mạnh. Nó chỉ là một đường cú pháp. Nếu đối tượng cơ bản không có thuộc tính, nó sẽ không chạy được. nhưng bạn không thể sử dụng thuộc tính nếu tên của thuộc tính chứa các ký tự đặc biệt, ví dụ: 99BottlesOfBeer, không gian tên, Đó là Toàn bộ. Vì vậy, trong những trường hợp đó, chúng ta có thể sử dụng các thuộc tính được lập chỉ mục. Câu trả lời khác khiến bạn nghĩ rằng đó là một hoặc khác, nhưng bạn có thể kết hợp và kết hợp thuộc tính và chỉ mục.
PAS

-3

Bạn có thể sử dụng thư viện Newtonsoft và sử dụng nó như sau

using Newtonsoft.Json;



public class jb
{
     public DateTime Date { set; get; }
     public string Artist { set; get; }
     public int Year { set; get; }
     public string album { set; get; }

}
var jsonObject = new jb();

jsonObject.Date = DateTime.Now;
jsonObject.Album = "Me Against The World";
jsonObject.Year = 1995;
jsonObject.Artist = "2Pac";


System.Web.Script.Serialization.JavaScriptSerializer oSerializer =
         new System.Web.Script.Serialization.JavaScriptSerializer();

string sJSON = oSerializer.Serialize(jsonObject );

5
bạn không thực sự sử dụng thư viện newtonsoft ở đây
Mickey Perlstein
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 cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.