在c#中构造JSON对象?

在c#中构造JSON对象?,c#,json,serialization,C#,Json,Serialization,我想创建一个json,如下所示: {'sr_no':'OH009876673','data':[{'code':'0124','findex':'3'},{'code':'0126','findex':'5'},{'code':'0125','findex':'8'} 我正试图这样做,但由于我使用postData作为字典,所以出现了错误 代码 var data = new Dictionary<int, string>(); JavaScriptSerializer jss = ne

我想创建一个json,如下所示:

{'sr_no':'OH009876673','data':[{'code':'0124','findex':'3'},{'code':'0126','findex':'5'},{'code':'0125','findex':'8'}

我正试图这样做,但由于我使用postData作为字典,所以出现了错误

代码

var data = new Dictionary<int, string>();
JavaScriptSerializer jss = new JavaScriptSerializer();
axCZKEM1.EnableDevice(iMachineNumber, false);
Cursor = Cursors.WaitCursor;
axCZKEM1.ReadAllUserID(iMachineNumber);//read all the user information to the memory
axCZKEM1.ReadAllTemplate(iMachineNumber);//read all the users' fingerprint templates to the memory
while (axCZKEM1.SSR_GetAllUserInfo(iMachineNumber, out sdwEnrollNumber, out sName, out sPassword, out iPrivilege, out bEnabled))//get all the users' information from the memory
{
    for (idwFingerIndex = 0,i=0; idwFingerIndex < 10; idwFingerIndex++,i++)
    {
        if (axCZKEM1.GetUserTmpExStr(iMachineNumber, sdwEnrollNumber, idwFingerIndex, out iFlag, out sTmpData, out iTmpLength))//get the corresponding templates string and length from the memory
        {

            var obj = new Dictionary<string, string>();
            obj["code"] = sdwEnrollNumber;
            obj["findex"] = idwFingerIndex.ToString();
            data[i] = jss.Serialize(obj);
            i++;
        }
    }
}

axCZKEM1.EnableDevice(iMachineNumber, true);

var client = new RestClient();
client.EndPoint = @"";
var postData = new Dictionary<string, string>();
postData["sr_no"] = sr_no;
postData["data"] = data;  // error on this line because data is array and trying to assign to string
var data=newdictionary();
JavaScriptSerializer jss=新的JavaScriptSerializer();
axCZKEM1.启用设备(iMachineNumber,false);
Cursor=Cursors.WaitCursor;
axCZKEM1.ReadAllUserID(iMachineNumber)//将所有用户信息读取到内存中
axCZKEM1.ReadAllTemplate(iMachineNumber)//将所有用户的指纹模板读取到内存中
while(axCZKEM1.SSR_GetAllUserInfo(iMachineNumber、out-sdwEnrollNumber、out-sName、out-sPassword、out-iPrivilege、out-bEnabled))//从内存中获取所有用户信息
{
对于(idwFingerIndex=0,i=0;idwFingerIndex<10;idwFingerIndex++,i++)
{
if(axCZKEM1.GetUserTmpExStr(iMachineNumber、sdwEnrollNumber、idwFingerIndex、out iFlag、out sTmpData、out iTmpLength))//从内存中获取相应的模板字符串和长度
{
var obj=新字典();
obj[“代码”]=编号;
obj[“findex”]=idwFingerIndex.ToString();
数据[i]=jss.Serialize(obj);
i++;
}
}
}
axCZKEM1.启用设备(iMachineNumber,true);
var client=new RestClient();
client.EndPoint=@;
var postData=新字典();
postData[“sr_no”]=sr_no;
postData[“数据”]=数据;//此行出错,因为数据是数组,正在尝试分配给字符串

如何解决这个问题,因为我希望JSON中的对象数组请求API

您可以使用
NewtonSoft.Json
序列化对象。由于您已经有了预期json数据的示例,因此可以在上生成c#类

试试这个:

            var sr_no = "";
            var data =new List<Data>();
            JavaScriptSerializer jss = new JavaScriptSerializer();
            axCZKEM1.EnableDevice(iMachineNumber, false);
            Cursor = Cursors.WaitCursor;
            axCZKEM1.ReadAllUserID(iMachineNumber);//read all the user information to the memory
            axCZKEM1.ReadAllTemplate(iMachineNumber);//read all the users' fingerprint templates to the memory
            while (axCZKEM1.SSR_GetAllUserInfo(iMachineNumber, out sdwEnrollNumber, out sName, out sPassword, out iPrivilege, out bEnabled))//get all the users' information from the memory
            {
                for (idwFingerIndex = 0, i = 0; idwFingerIndex < 10; idwFingerIndex++, i++)
                {
                    if (axCZKEM1.GetUserTmpExStr(iMachineNumber, sdwEnrollNumber, idwFingerIndex, out iFlag, out sTmpData, out iTmpLength))//get the corresponding templates string and length from the memory
                    {

                        data.Add(new Data { code = sdwEnrollNumber, findex = idwFingerIndex.ToString() });
                        i++;
                    }
                }
            }

            var postObject = new RootObject
            {
                sr_no = sr_no,
                data = data
            };
            var postData = jss.Serialize(postObject);

public class Data
{
    public string code { get; set; }
    public string findex { get; set; }
}

public class RootObject
{
    public string sr_no { get; set; }
    public List<Data> data { get; set; }
}
var sr_no=”“;
var data=新列表();
JavaScriptSerializer jss=新的JavaScriptSerializer();
axCZKEM1.启用设备(iMachineNumber,false);
Cursor=Cursors.WaitCursor;
axCZKEM1.ReadAllUserID(iMachineNumber)//将所有用户信息读取到内存中
axCZKEM1.ReadAllTemplate(iMachineNumber)//将所有用户的指纹模板读取到内存中
while(axCZKEM1.SSR_GetAllUserInfo(iMachineNumber、out-sdwEnrollNumber、out-sName、out-sPassword、out-iPrivilege、out-bEnabled))//从内存中获取所有用户信息
{
对于(idwFingerIndex=0,i=0;idwFingerIndex<10;idwFingerIndex++,i++)
{
if(axCZKEM1.GetUserTmpExStr(iMachineNumber、sdwEnrollNumber、idwFingerIndex、out iFlag、out sTmpData、out iTmpLength))//从内存中获取相应的模板字符串和长度
{
Add(新数据{code=sdwEnrollNumber,findex=idwFingerIndex.ToString()});
i++;
}
}
}
var postObject=新的根对象
{
sr_no=sr_no,
数据=数据
};
var postData=jss.Serialize(postObject);
公共类数据
{
公共字符串代码{get;set;}
公共字符串findex{get;set;}
}
公共类根对象
{
公共字符串sr_no{get;set;}
公共列表数据{get;set;}
}

我还建议使用
newtonsoft
而不是
JavaScriptSerializer

你试过使用Json.NET吗?现在,它通常比JavaScriptSerializer更受欢迎。它在VisualStudio2008或2010中可以工作吗@JonSkeet@SaMeEr它适用于所有版本的.NET-请参阅。您可能需要手动获取DLL并将其导入到您的项目中,因为VS2008并不真正支持nuget。然而,图书馆本身并没有问题,它将发挥作用。另请参见:我应该在哪里添加这些类?在主文件中或在不同的文件中。在同一个文件中是可以的。但是如果我试图在同一个文件中添加这些类,它会给我错误。在你的帖子中,在方法之外添加它显然是我在外部添加的。
RootObject obj = new RootObject();
obj.sr_no = "OH009876673";
obj.data = new List<Datum>();
......
......
while (axCZKEM1.SSR_GetAllUserInfo(iMachineNumber, out sdwEnrollNumber, out sName, out sPassword, out iPrivilege, out bEnabled))//get all the users' information from the memory
{
    for (idwFingerIndex = 0,i=0; idwFingerIndex < 10; idwFingerIndex++,i++)
    {
        if (axCZKEM1.GetUserTmpExStr(iMachineNumber, sdwEnrollNumber, idwFingerIndex, out iFlag, out sTmpData, out iTmpLength))//get the corresponding templates string and length from the memory
        {

            //var obj = new Dictionary<string, string>();
            //obj["code"] = sdwEnrollNumber;
            //obj["findex"] = idwFingerIndex.ToString();
            //data[i] = jss.Serialize(obj);
            //i++;
            obj.data.Add( new Datum() {code = sdwEnrollNumber, findex = idwFingerIndex.ToString()});
        }
    }
}

axCZKEM1.EnableDevice(iMachineNumber, true);

var client = new RestClient();
client.EndPoint = @"";

var outputJson = JsonConvert.SerializeObject(obj);
            var sr_no = "";
            var data =new List<Data>();
            JavaScriptSerializer jss = new JavaScriptSerializer();
            axCZKEM1.EnableDevice(iMachineNumber, false);
            Cursor = Cursors.WaitCursor;
            axCZKEM1.ReadAllUserID(iMachineNumber);//read all the user information to the memory
            axCZKEM1.ReadAllTemplate(iMachineNumber);//read all the users' fingerprint templates to the memory
            while (axCZKEM1.SSR_GetAllUserInfo(iMachineNumber, out sdwEnrollNumber, out sName, out sPassword, out iPrivilege, out bEnabled))//get all the users' information from the memory
            {
                for (idwFingerIndex = 0, i = 0; idwFingerIndex < 10; idwFingerIndex++, i++)
                {
                    if (axCZKEM1.GetUserTmpExStr(iMachineNumber, sdwEnrollNumber, idwFingerIndex, out iFlag, out sTmpData, out iTmpLength))//get the corresponding templates string and length from the memory
                    {

                        data.Add(new Data { code = sdwEnrollNumber, findex = idwFingerIndex.ToString() });
                        i++;
                    }
                }
            }

            var postObject = new RootObject
            {
                sr_no = sr_no,
                data = data
            };
            var postData = jss.Serialize(postObject);

public class Data
{
    public string code { get; set; }
    public string findex { get; set; }
}

public class RootObject
{
    public string sr_no { get; set; }
    public List<Data> data { get; set; }
}