我需要在PHP中向JSON字符串添加字段,但我';我有问题

我需要在PHP中向JSON字符串添加字段,但我';我有问题,php,json,string,Php,Json,String,所以。。。我需要在内存极其有限的平台上保存大量数据 因此,我基本上是将数据存储在Web服务器上,使用php脚本将JSON写入平面文件,因为我很懒 我可以麻烦地让它将数据存储在我的mysql服务器中,但坦率地说,平面文件的事情本来应该是微不足道的,但我遇到了一个问题。有几种快速而肮脏的解决方法可以修复它,但我一直在尝试用“正确”的方法修复它(我知道,我知道,正确的方法是只将数据存储在mysql中,但我实际上需要能够将生成的json文件发送回需要数据的平台(以一种可笑的迂回方式),所以首先让php将

所以。。。我需要在内存极其有限的平台上保存大量数据

因此,我基本上是将数据存储在Web服务器上,使用php脚本将JSON写入平面文件,因为我很懒

我可以麻烦地让它将数据存储在我的mysql服务器中,但坦率地说,平面文件的事情本来应该是微不足道的,但我遇到了一个问题。有几种快速而肮脏的解决方法可以修复它,但我一直在尝试用“正确”的方法修复它(我知道,我知道,正确的方法是只将数据存储在mysql中,但我实际上需要能够将生成的json文件发送回需要数据的平台(以一种可笑的迂回方式),所以首先让php将其保存为平面文件是有意义的。除了这个问题之外,它已经在工作了,所以我讨厌重新移植

请看…由于平台内存不足,我将json从发送到服务器…我一次发送一个字段。每次调用php脚本只设置一个字段

因此,基本上我要做的是从磁盘加载文件(如果存在),并通过json_decode运行它以获得我的存储对象,然后php文件获得一个键参数和一个值参数,如果键类似于“object1,object2”,它将其分解,获取结果数组的长度,然后将值存储在$data->$key[0]->$key[1]中

然后用fwrite($file,json_encode($data))将其保存回磁盘

这一切都很好。除了$value是一个简单的字符串时。如果它是一个数组,它工作得很好。如果它是一个数字,它工作得很好。如果它是一个字符串,我从json_decode得到null。我已经尝试了我能想到的所有方法,强制在$value变量的末尾加引号,希望让json_decode识别它。没有任何方法可以工作

我尝试过在值是字符串而不是数组或数字的情况下设置$data->$key[0]->$key[1]=$value。没有骰子,php只是抱怨我试图设置一个不存在的对象。如果我使用json_decode的输出来设置字段,这很好,但它本身不会接受字符串

所以我不知道

有人知道我如何让json_decode不被一个字符串阻塞,或者在不使用json_decode输出的情况下向现有php对象添加一个新字段吗

我肯定有一些明显的东西我遗漏了。应该清楚的是,我不是php大师。我从来没有在php中真正使用过数组和对象,所以它们的变幻莫测不是我所熟悉的

我已经意识到,但更愿意避免的解决方案是:我可以让发送post请求的平台用方括号包装单个非数值,创建单个项数组,但据我所知,这不应该是必要的,所以这样做让我很烦恼(最终花费了我大约半KB的不需要使用的存储空间)


我还可以将我的一些json从对象更改为数组,以便让php让我更容易地添加项,但似乎应该有一个解决方案不需要这样做,所以我真的不想…

我浏览了你的文章

我知道这对StdClass有效:

 $yourClass->newField = $string;

这就是你想要的吗?

好吧……最终,尽可能简洁地说,问题是:

假设我们在$data中有这个JSON:

{
    "key1":
    {
        "key2":["somedata","someotherdata"]
    }
}
我们希望它是:

{
    "key1":
    {
        "key2":["somedata","someotherdata"],
        "key3":"key3data"
    }
}
php脚本已接收“key=key1,key3&value=key3data”作为其post数据,并由此初始化:

$key = $_POST["key"];
$key = explode($key,",");

$value = $_POST["value"];
…它为我们提供了一个数组($key),表示要设置为字段的嵌套json键,以及一个变量($value),其中包含要设置为的值

方法1:

…失败。当我们重新编码$data时,它会创建此JSON:

{
    "key1":
    {
        "key2":["somedata","someotherdata"],
        "key3":null
    }
}
方法2:

…也失败。它根本无法将字段插入$data

但后来我意识到,#2的问题是它不允许我设置不存在的字段,而方法#1的问题是它设置了错误的字段

所以我所要做的就是用蛮力

$data->$key[0]->$key[1] = json_decode($value);

if (json_decode($value) == NULL)
{
    $data->$key[0]->$key[1] = $value;
}
这是可行的!因为方法1创建了字段(尽管值不正确),PHP现在允许我毫无怨言地设置该字段的值


这是一种非常强力的解决问题的方法,如果我能更好地理解PHP对象,我相信会有更好的方法。但这是有效的,所以至少我的代码可以正常工作。

请将您的问题简化为本质问题。可靠的平面文件存储实际上可能比简单的关系数据库更难实现。此外,原生json_encode/json_decode函数不适用于大型数据集,因为它们在内存中加载所有内容。你应该可以在.Feck中找到一些json拉式解析器!我花了一整天的时间来解决这个问题。当我发布帮助信息时,我有了一个想法。只要让php在对象中插入null,然后设置字段到$value,现在这个字段已经存在。当然,这是可行的。我是个白痴。在Web服务器上,将所有内容加载到内存不是问题。整个数据集大约有50或60k,但这远远超过发送数据的平台所能处理的,信不信由你。恐怕不行,或者至少,它不起作用我。字段名实际上是作为变量读入的,所以我不能这样静态编码。它必须是$yourClass->$key[0],php似乎不喜欢这样,拒绝插入字段。
$data->$key[0]->$key[1] = $value;
$data->$key[0]->$key[1] = json_decode($value);

if (json_decode($value) == NULL)
{
    $data->$key[0]->$key[1] = $value;
}