สร้าง JSON ได้ทันทีด้วย JObject


96

สำหรับการทดสอบหน่วยของฉันฉันต้องการความสามารถในการสร้างค่า JSON เฉพาะ (ในกรณีนี้บันทึกอัลบั้ม) ที่สามารถใช้เป็นอินพุตสำหรับระบบที่กำลังทดสอบ

ฉันมีรหัสต่อไปนี้:

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

มันใช้งานได้ดี แต่ฉันไม่เคยชอบไวยากรณ์ของ "magic string" และต้องการอะไรที่ใกล้เคียงกับไวยากรณ์ของคุณสมบัติ expando ใน JavaScript เช่นนี้:

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

5
คุณควรได้รับคะแนนสองเท่าสำหรับการเลือกศิลปิน / อัลบั้ม!
spottedmahn

คำตอบ:


143

แล้วเป็นอย่างไรบ้าง:

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

3
สมบูรณ์แบบ! dynamicสิ่งที่ผมกำลังมองหาสมบูรณ์ลืมเกี่ยวกับ
Karl Anderson

ฉันได้รับ 'Newtonsoft.Json.Linq.JObject' ไม่มีคำจำกัดความสำหรับข้อผิดพลาด 'วันที่' เมื่อฉันพยายามเรียกใช้รหัสของคุณ วิธีที่ฉันสามารถทำให้มันใช้งานได้คือเปลี่ยนบรรทัดแรกเป็น: dynamic jsonExpando = new ExpandoObject();และเพิ่มบรรทัดหลังรหัสของคุณ:JObject jsonObject = JObject.FromObject(jsonExpando);
BornToCode

3
หากคุณต้องการเพิ่มรายการ <> ไปยังวัตถุ Json jsonObject.list = JToken.FromObject(mylist);ของคุณคุณจะต้องทำสิ่งที่ชอบ
Steve Smith

คุณสามารถใช้การรวมกันของดัชนีและสัญกรณ์คุณสมบัติในกรณีที่คุณตีชื่อฟิลด์ที่มีอักขระพิเศษเช่น Create-Year "คุณจะไม่สามารถเขียน jsonObject.Create-Year = 1995 ได้ แต่สามารถใช้ดังต่อไปนี้ jsonObject [" Create-Year "] = 1995; jsonObject.Artist =" 2Pac ";
PAS

71

คุณสามารถใช้การJObject.Parseดำเนินการและเพียงแค่ใส่ข้อความ JSON ที่คั่นด้วยเครื่องหมายคำพูดเดี่ยว

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

สิ่งนี้มีประโยชน์ที่ดีในการเป็น JSON และอ่านเป็น JSON

หรือคุณมีข้อมูลการทดสอบที่เป็นไดนามิกคุณสามารถใช้JObject.FromObjectการดำเนินการและจัดหาวัตถุแบบอินไลน์ได้

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

เอกสาร Json.net สำหรับการทำให้เป็นอนุกรม


10
JObject.FromObject ควรทำเครื่องหมายเป็นคำตอบที่ถูกต้อง ขอบคุณ.
Thomas

1
ผมคิดว่าจะไม่ทำงานหากมีคุณสมบัติที่มีตัวอักษรพิเศษเช่นJObject.FromObject -
Jatin Sanghvi

39

ค่าdynamicหรือJObject.FromObjectปัญหาการทำงานได้เมื่อคุณมีคุณสมบัติ JSON ที่ไม่ถูกต้อง C # "@odata.etag"ชื่อตัวแปรเช่น ฉันชอบไวยากรณ์ตัวสร้างดัชนีเริ่มต้นในกรณีทดสอบของฉัน:

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

การมีชุดสัญลักษณ์ล้อมรอบแยกต่างหากสำหรับการเริ่มต้นJObjectและสำหรับการเพิ่มคุณสมบัติทำให้ดัชนีเริ่มต้นอ่านได้ง่ายกว่าตัวเริ่มต้นอ็อบเจ็กต์คลาสสิกโดยเฉพาะอย่างยิ่งในกรณีของวัตถุ JSON แบบผสมดังต่อไปนี้:

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

ด้วยไวยากรณ์ของ object initializer การเริ่มต้นข้างต้นจะเป็น:

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

2
สุดท้ายคือไวยากรณ์ที่ดีที่สุดในการเขียน json ใน c #
Anthony Brenelière

ดูstackoverflow.com/questions/51015036/…สำหรับวิธีการทำเช่นนี้กับคอลเล็กชันเช่นกัน
kofifus

30

มีสภาพแวดล้อมบางอย่างที่คุณไม่สามารถใช้ไดนามิก (เช่น Xamarin.iOS) หรือในกรณีที่คุณเพียงแค่มองหาทางเลือกอื่นแทนคำตอบที่ถูกต้องก่อนหน้านี้

ในกรณีเหล่านี้คุณสามารถทำได้:

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")
         )

เอกสารเพิ่มเติมที่นี่: http://www.newtonsoft.com/json/help/html/CreatingLINQtoJSON.htm


2

วิธีง่ายๆในการสร้าง newtonsoft JObject จาก Properties

นี่คือคุณสมบัติของผู้ใช้ตัวอย่าง

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

และฉันต้องการคุณสมบัตินี้ใน newtonsoft JObject คือ:

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

ผลลัพธ์จะเป็นดังนี้:

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

2

ไม่ช้าก็เร็วคุณจะมีทรัพย์สินที่มีลักษณะพิเศษ คุณสามารถใช้ดัชนีหรือการรวมกันของดัชนีและคุณสมบัติ

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

สิ่งนี้ตอบคำถามได้อย่างไร?
Enigmativity

@Enigmativity ประเด็นที่ฉันกำลังทำคือคุณสามารถใช้สัญกรณ์ดัชนีและสัญกรณ์คุณสมบัติร่วมกันได้ คือ obj [x] = x1; obj.y = y1 สามารถใช้ในรหัสเดียวกันได้ การรวมกันของคำหลักแบบไดนามิกและสัญลักษณ์ดัชนีจะตอบคำถาม ไม่มีคำตอบอื่นใดที่กล่าวถึงเรื่องนี้ อาจเป็นไปได้ว่านี่ควรเป็นความคิดเห็นมากกว่าคำตอบ
PAS

ฉันแค่คิดว่าคำถามเกี่ยวกับการไม่ใช้เวทมนตร์ แต่คำตอบนี้ทำให้เขาได้รับสิ่งนั้น
Enigmativity

@Enigmativity คีย์เวิร์ดแบบไดนามิกเพียงแค่หลอกคอมไพเลอร์ มันก็ไม่ต่างจากสตริงตามอำเภอใจ วัตถุประเภท dynmaic ไม่ได้ถูกพิมพ์อย่างรุนแรง มันเป็นเพียงน้ำตาลที่เป็นประโยค หากวัตถุต้นแบบไม่มีคุณสมบัติก็จะล้มเหลวในการรันไทม์ แต่คุณไม่สามารถใช้คุณสมบัติได้หากชื่อของคุณสมบัติมีอักขระพิเศษเช่น 99BottlesOfBeer, namespace, It's-All-Over ดังนั้นในกรณีดังกล่าวเราสามารถใช้คุณสมบัติที่จัดทำดัชนีได้ คำตอบอื่น ๆ ทำให้คุณคิดว่าเป็นอย่างอื่น แต่คุณสามารถผสมและจับคู่คุณสมบัติและดัชนีได้
PAS

-3

คุณสามารถใช้ไลบรารี Newtonsoft และใช้งานได้ดังนี้

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
คุณไม่ได้ใช้ห้องสมุด newtonsoft ที่นี่
Mickey Perlstein
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.