【问题标题】:Write JSON value to SQL database将 JSON 值写入 SQL 数据库
【发布时间】:2017-01-22 08:41:10
【问题描述】:

我有这样的 JSON

"id": 823,
"parent_id": 0,
"status": "on-hold",
"order_key": "wc_order_562b39a2050f2",
"currency": "USD",
"version": "2.4.7",
"prices_include_tax": false,
"date_created": "2015-10-24T07:56:18",
"date_modified": "2015-10-24T07:56:18",
"customer_id": 0,
"discount_total": 0.00,
"discount_tax": 0.00,
"shipping_total": 0.00,
"shipping_tax": 0.00,
"cart_tax": 0.00,
"total": 76.98,
"total_tax": 0.00,

我是这样解析的`

 RestAPI rest = new RestAPI("*******", "*******", "*********");
        WCObject wc = new WCObject(rest);
        //Get all products
         var orders = await wc.GetOrders(new Dictionary<string, string>() {
            { "per_page", "100" }});




        string products = orders.ToFormattedJsonString();`

我需要以"total" 字段为例,并将其写入数据库中的字段。

对于数据库写入,我有例如此代码MySqlCommand addCommand = new MySqlCommand("INSERT INTO demotable (salary,surname) VALUES (1234,'Luk')", connection); addCommand.ExecuteNonQuery();

但是我可以有很多订单。我需要为 JSON 中的每个订单执行此操作。

我该怎么做?

【问题讨论】:

  • 简短回答“循环中”。请同时参数化您的 sql 以避免注入攻击。你已经有一个由 GetOrders 返回的对象集合,为什么你在做 ToFormattedJsonString 然后试图把它放在数据库中?
  • ToFormattedJsonString 将显示在控制台中。@PaulSwetz
  • 那么 JSON 与您的问题无关,只需循环订单集合即可。
  • 那不是有效的完整 JSON,它与您的 (salary,surname) 示例不匹配。如果您只需要一两条信息,您可以使用 JSON.NET 在循环中解析出您想要的值。
  • 好的。我使用我的 Json 答案并将其带到 json2csharp 以反序列化它。这样对吗? @PaulSwetz

标签: c# .net json uwp


【解决方案1】:

Your JSON 是一个数组,因此,如果您只想从每个项目中获取一条信息,您可以将其放入 JArray 以获取您想要的信息。这比反序列化为您不需要且不会使用的类更简单:

string jstr = ... from whereever ...

// get into array
var jobj = JArray.Parse(jstr);

for (int n = 0; n < jobj.Count - 1; n++)
{ 
    // save to a List or update DB 
    Console.WriteLine(jobj[n]["email"]);
}

部分结果:

anastasiya.yenina@gmail.com
bakhnovska@gmail.com
cosporet@haribu.com

如果您需要很多片段,您可能希望将其反序列化为 T 的数组或列表并循环。

【讨论】:

    【解决方案2】:

    @Plutonix 答案是正确的。但我想展示另一种处理方式。

    Newtonsoft Json 是一个流行的 Json Parser,可以实现这一点。这是一个非常有用的软件包。从链接安装这个包。

    所以如果你的 json 字符串是

    string products = orders.ToFormattedJsonString();
    

    您的代码将是

    List<RootObject> rootObjectData = JsonConvert.DeserializeObject<List<RootObject>>(products);
    

    现在您可以循环浏览以下项目。

    foreach(RootObject root in rootObjectData)
    {
        foreach(Class1 c in root.Property1)
        {
            int id = c.id;
        }
    }
    

    注意:我在这里使用了您在 cmets 中提到的 pastebin URL 中的 RootObject

    【讨论】:

    • 太棒了。谢谢。我有一个问题。例如,我如何从id 获取数据?我知道这是一个简单的问题,但我第一次处理这个问题。
    • @Eugene 更新答案以获得id
    • 好的,非常感谢。也许你的意思是root.Property1 而不是ro.Property1
    • Class1 中有这个Additional information: Object reference not set to an instance of an object.
    • 哪里坏了?哪条线路?
    【解决方案3】:

    使用Json.net 将您的 JSON 反序列化为 IEnumerable。使用循环遍历您的反序列化集合并为每个集合执行查询。

    【讨论】:

    • 通常这是正确的,但在这种情况下,他应该直接遍历订单集合并完全跳过使用 json 的工作(或者只是将字符串转储到控制台)。
    猜你喜欢
    • 2017-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-14
    • 2019-07-14
    • 1970-01-01
    相关资源
    最近更新 更多