การทำให้รายการสตริงเป็นอนุกรมเป็น JSON ใน C #

(ฉันได้ย้ำคำถามของฉันที่นี่: การสร้างอินสแตนซ์คลาสตามรายการรายการแบบไดนามิก)

ขณะนี้ฉันกำลังทำงานกับโปรแกรมใน Visual Studio 2015 ด้วย C#

ฉันมีสตริงรายการ 5 รายการที่มีข้อมูลที่ฉันต้องการทำให้เป็นอนุกรมเป็นไฟล์ json

public List<string> name { get; private set; }
public List<string> userImageURL { get; private set; }
public List<string> nickname { get; private set; }
public List<string> info { get; private set; }
public List<string> available { get; private set; }

ตัวอย่างของรูปแบบไฟล์ json ที่ต้องการคือรูปแบบต่อไปนี้:

{
    "users" : 
    [
        {
            "name" : "name1",
            "userImageURL" : "userImageURL1",
            "nickname" : "nickname1",
            "info" : "info1",
            "available" : false,
        },
        {
            "name" : "name2",
            "userImageURL" : "userImageURL2",
            "nickname" : "nickname2",
            "info" : "info2",
            "available" : false,
        },
        {
            "name" : "name3",
            "userImageURL" : "userImageURL3",
            "nickname" : "nickname3",
            "info" : "info3",
            "available" : false,
        },
        {
            "name" : "name4",
            "userImageURL" : "userImageURL4",
            "nickname" : "nickname4",
            "info" : "info4",
            "available" : false,
        }

    ]
} 

โปรดทราบว่าอาจมีข้อผิดพลาดในตัวอย่าง json ด้านบน

ฉันได้ลองรวม 5 รายการเพื่อสร้าง 1 รายการเพื่อทำให้เป็นอนุกรมโดยใช้รหัสต่อไปนี้:

users = new List<string>(name.Count + userImageURL.Count + nickname.Count + info.Count + available.Count);
            allPlayers.AddRange(name);
            allPlayers.AddRange(userImageURL);
            allPlayers.AddRange(nickname);
            allPlayers.AddRange(info);
            allPlayers.AddRange(available);

จากนั้นฉันก็ทำให้รายการเป็นอนุกรมด้วยโค้ดที่ตกลงมา:

string data = JsonConvert.SerializeObject(users);
            File.WriteAllText("data.json", data);

นี่เป็นเพียงการสร้างอาร์เรย์ของวัตถุที่ไม่มีการจัดระเบียบ ฉันอยากรู้ว่าฉันจะจัดระเบียบพวกมันตามที่แสดงในรูปแบบด้านบนได้อย่างไร

PS: ฉันค่อนข้างใหม่กับการเขียนโค้ดอย่างที่คุณบอกได้ ขออภัยถ้าฉันแสดงคำถามไม่ถูกต้องหรือใช้คำศัพท์ที่ถูกต้อง นอกจากนี้นี่ไม่ใช่รหัสต้นฉบับ รหัสจะสร้างรายการนี้ซึ่งฉันต้องการทำให้เป็นอนุกรมเป็นไฟล์ json

PSS: ข้อมูลนี้รวบรวมโดยใช้ HtmlAgilityPack เมื่อวานฉันถามคำถามถามว่าฉันจะแยกวิเคราะห์ไฟล์ html และทำให้ข้อมูลเป็นอนุกรมเป็นไฟล์ json ได้อย่างไร การใช้ HtmlAgilityPack เพื่อรับ ข้อมูลเฉพาะใน C# และทำให้เป็นอนุกรมเป็น json เมื่อไม่มีใครตอบ ฉันจึงตัดสินใจลองทำด้วยตัวเอง วิธีที่ผมใช้อาจจะไม่ดีที่สุดแต่คือสิ่งที่ผมสามารถทำได้ด้วยความรู้ที่มี


person Jose Cancel    schedule 29.02.2016    source แหล่งที่มา
comment
คุณสมบัติของคุณจะไม่สร้างผลลัพธ์นั้นอยู่ดี คุณต้องสร้างคลาสผู้ใช้และสร้างรายการนั้น ไม่ใช่รายการทรัพย์สินแต่ละรายการ   -  person Cubicle.Jockey    schedule 01.03.2016
comment
คุณไม่จำเป็นต้องเขียนด้วยเครื่องหมายคำพูดทุกที่ นั่นไม่ใช่วิธีเขียนปกติ คุณจะเข้าใจได้ง่ายขึ้นถ้าคุณเขียนถูกต้องมากขึ้น   -  person JK.    schedule 01.03.2016
comment
ฉันประทับใจเล็กน้อยที่คำถามของฉันได้รับการโหวตมาก ฉันพยายามทำให้คำถามของฉันง่ายขึ้นเพราะฉันไม่แน่ใจว่าคนที่เราไม่ตอบคำถามอื่นๆ ของฉันหรือเปล่าเพราะพวกเขายาวเกินไป   -  person Jose Cancel    schedule 01.03.2016
comment
ไม่แน่ใจว่ามีใครสามารถช่วยฉันได้บ้างในตอนนี้ แต่ฉันได้ย้ำคำถามของฉันที่นี่: stackoverflow.com/questions/35782580/   -  person Jose Cancel    schedule 04.03.2016


คำตอบ (2)


ฉันขอแนะนำให้ปรับโครงสร้างโค้ดของคุณใหม่โดยเริ่มต้น - แทนที่จะมี 5 "คอลเลกชันแบบขนาน" มีคอลเลกชัน เดี่ยว ประเภทใหม่ User:

public class User
{
    public string Name { get; set; }
    public string ImageUrl { get; set; }
    public string NickName { get; set; }
    public string Info { get; set; }
    public bool Available { get; set; }
}

...

// In your containing type
public List<User> Users { get; set; }

สิ่งนี้มีแนวโน้มที่จะทำให้ชีวิตง่ายขึ้นไม่เพียงแต่สำหรับ JSON ของคุณ แต่สำหรับโค้ดที่เหลือด้วย - เนื่องจากคุณไม่มีโอกาสที่จะมีชื่อเล่นมากกว่า URL รูปภาพ ฯลฯ โดยทั่วไปแล้ว การมีคอลเลกชันหลายรายการที่ต้องเก็บไว้ใน การซิงค์ซึ่งกันและกันเป็นการต่อต้านรูปแบบ มี มี ครั้งตามความเหมาะสม ซึ่งโดยทั่วไปแล้วจะมีวิธีที่มีประสิทธิภาพที่แตกต่างกันในการดึงข้อมูลเดียวกัน แต่สำหรับสิ่งนี้ ควรหลีกเลี่ยงอย่างดีที่สุด

person Jon Skeet    schedule 29.02.2016
comment
@JoseCancel: คำตอบยังคงเหมือนเดิม - คุณควรปรับโครงสร้างข้อมูลของคุณใหม่โดยเร็วที่สุด คุณสามารถทำเช่นนั้นได้แม้ว่าคุณจะเริ่มต้นด้วยรายการแยกกันห้ารายการก็ตาม - person Jon Skeet; 01.03.2016
comment
ข้อมูลนี้รวบรวมโดยใช้ HtmlAgilityPack เมื่อวานฉันถามคำถามถามว่าฉันจะแยกวิเคราะห์ไฟล์ html และทำให้ข้อมูลเป็นอนุกรมเป็นไฟล์ json ได้อย่างไร stackoverflow.com/questions/35693367/ เมื่อไม่มีใครตอบ ฉันจึงตัดสินใจลองทำด้วยตัวเอง วิธีที่ผมใช้อาจจะไม่ดีที่สุดแต่คือสิ่งที่ผมสามารถทำได้ด้วยความรู้ที่มี - person Jose Cancel; 01.03.2016
comment
ฉันจัดการรวบรวมข้อมูลที่ต้องการได้ และตอนนี้ฉันกำลังเผชิญกับงานซีเรียลไลซ์ข้อมูลให้เป็นไฟล์ json หากคุณสามารถช่วยฉันในเรื่องนี้ได้โปรดทำเช่นนั้น หากคุณทราบวิธีการที่ดีกว่าโปรดแบ่งปันด้วย - person Jose Cancel; 01.03.2016
comment
@JoseCancel: ถ้าคุณมีวัตถุรูทที่มีคุณสมบัติที่เรียกว่า Users ประเภท List<User> และคุณใช้ JsonConvert.SerializeObject(root) มันก็ควรจะใช้งานได้ ใช้ [JsonProperty] เพื่อปรับชื่อที่ใช้ใน JSON - person Jon Skeet; 01.03.2016
comment
ขอบคุณสำหรับการให้ฉันรู้ว่า. ฉันจะค้นคว้าเกี่ยวกับ [JsonProperty] - person Jose Cancel; 01.03.2016
comment
ไม่แน่ใจว่าคุณสามารถช่วยฉันได้หรือไม่ แต่ฉันได้ย้ำคำถามของฉันที่นี่: stackoverflow.com/questions/35782580/ - person Jose Cancel; 04.03.2016

จริงๆ แล้วมันคือสิ่งที่จอนพูด แต่หากต้องการย้ายจากรายการคู่ขนานของคุณไปยังรายการเดี่ยวของจอน คุณต้องมีสิ่งที่คล้ายกัน (สมมติว่ารายการทั้งหมดมีจำนวนองค์ประกอบเท่ากันในลำดับเดียวกัน):

Users = new List<User>();
for (var i = 0; i < name.Count; i++)
{
    Users.Add(new User
    {
        Available = available[i],
        ImageUrl = userImageURL[i],
        Info = info[i],
        Name = name[i],
        NickName = nickname[i]
    });
}

จากนั้นทำให้รายชื่อผู้ใช้เป็นอนุกรม

person fistix    schedule 29.02.2016